Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 发送空数据的JSON请求(swift)_Php_Ios_Json_Swift_Xcode - Fatal编程技术网

Php 发送空数据的JSON请求(swift)

Php 发送空数据的JSON请求(swift),php,ios,json,swift,xcode,Php,Ios,Json,Swift,Xcode,我的iOS应用程序正在向web服务发送空数据。我花了好几个小时寻找解决办法,但什么都没用。 应用程序应该通过php脚本向数据库发送一个kontrah号码。然后数据库必须识别是否可以在数据库中找到kontrah数。然后,如果号码正确,我将收到来自数据库服务器的请求。问题是我发送的号码肯定是正确的。我查看了要发送到数据库的内容,但都是空的: {"kontrah":null,"telefon":null,"opis":null,"afakt":null} 我也制作了同样的应用程序,但在android

我的iOS应用程序正在向web服务发送空数据。我花了好几个小时寻找解决办法,但什么都没用。 应用程序应该通过php脚本向数据库发送一个kontrah号码。然后数据库必须识别是否可以在数据库中找到kontrah数。然后,如果号码正确,我将收到来自数据库服务器的请求。问题是我发送的号码肯定是正确的。我查看了要发送到数据库的内容,但都是空的:

{"kontrah":null,"telefon":null,"opis":null,"afakt":null}
我也制作了同样的应用程序,但在android Studio中使用Java在android上运行,一切正常

我的代码:

@IBAction func submitAction(_ sender: AnyObject) {
    let kontrah: String = fkontrah.text!
     let telefon: String = ftelefon.text!



    let json = [ "kontrah" : (kontrah), "telefon" : (telefon), "opis" : (selectedvalue), "afakt" : (selectedafakt)  ]

    print (json)

    do {
        let jsonData = try JSONSerialization.data(withJSONObject: json, options: .prettyPrinted)
        print(jsonData)
        // create post request
        let url = NSURL(string: "http://hetman.pl/ios/post2.php")!
        let request = NSMutableURLRequest(url: url as URL)
        request.httpMethod = "POST"

        // insert json data to the request
        request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
        request.httpBody = jsonData



        let task = URLSession.shared.dataTask(with: request as URLRequest){ data, response, error in
            if error != nil{
                return
            }

            do {
                let t  = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject]
                print(t)

            } catch {
                print("Error  43-> \(error)")
            }
        }
        let alert = UIAlertController(title: "Wysłano poprawnie", message: "", preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
        self.present(alert, animated: true, completion: nil)


        task.resume()


    }

    catch {
        //handle error. Probably return or mark function as throws
        print(error)
        return
    }
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return(true)
}

}
@iAction func submitAction(\uSender:AnyObject){
让kontrah:String=fkontrah.text!
让telefon:String=ftelefon.text!
让json=[“kontrah”:(kontrah),“telefon”:(telefon),“opis”:(selectedvalue),“afakt”:(selectedafkt)]
打印(json)
做{
让jsonData=try JSONSerialization.data(使用jsonObject:json,选项:。预打印)
打印(jsonData)
//创建post请求
让url=NSURL(字符串:http://hetman.pl/ios/post2.php")!
let request=NSMutableURLRequest(url:url作为url)
request.httpMethod=“POST”
//向请求中插入json数据
request.setValue(“application/json;charset=utf-8”,forHTTPHeaderField:“内容类型”)
request.httpBody=jsonData
让task=URLSession.shared.dataTask(其中:request作为URLRequest){data,response,中的错误
如果错误!=nil{
返回
}
做{
让t=尝试JSONSerialization.jsonObject(使用:data!,选项:[])作为?[String:AnyObject]
打印(t)
}抓住{
打印(“错误43->\(错误)”)
}
}
let alert=UIAlertController(标题:“Wysłano poprawnie”,消息:,首选样式:UIAlertControllerStyle.alert)
addAction(UIAlertAction(标题:“确定”,样式:UIAlertActionStyle.default,处理程序:nil))
self.present(警报、动画:true、完成:nil)
task.resume()
}
抓住{
//处理错误。可能将函数返回或标记为抛出
打印(错误)
返回
}
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
self.view.endEditing(true)
}
func textField应该返回(textField:UITextField)->Bool{
textField.resignFirstResponder()辞职
返回(真)
}
}
日志:

2017-12-29 15:59:43.867463+0100 Hetman4[10692:4029622]未能在(UITextView):[valueForUndefinedKey:]上设置用户定义的已检查属性(titleLabel.adjustsFontSizeToFitWidth):该类不符合键titleLabel的键值编码。
2017-12-29 15:59:47.717492+0100 Hetman4[10692:4029622][MC]systemgroup.com.apple.configurationprofiles的系统组容器路径为/Users/bartoszlucinski/Library/Developer/CoreSimulator/Devices/3BE9103E-97CA-4E0B-AE53-6196EE08C49D/data/Containers/Shared/systemgroup/systemgroup.com.apple.configurationprofiles
2017-12-29 15:59:47.717874+0100 Hetman4[10692:4029622][MC]从私人有效用户设置读取。
2017-12-29 15:59:52.225804+0100 Hetman4[10692:4029622]找不到支持键盘iPhone肖像Choco NumberPad类型4的键盘平面;默认情况下使用4072550144015629828
[“telefon”:“510356448”,“kontrah”:“1400-685”,“opis”:“Świnia”,“afakt”:“0”]
94字节
2017-12-29 15:59:57.074868+0100 Hetman4[10692:4029622]未能在(UITextView):[valueForUndefinedKey:]上设置(标题标签.调整NTSizeToFitWidth)用户定义的已检查属性:此类不符合键标题标签的键值编码。
2017-12-29 15:59:57.628832+0100 Hetman4[10692:4029622]不建议在分离的视图控制器上显示视图控制器。
可选([“错误”:,“结果”:kontrah不存在,“未经授权的请求”:0,“成功”:1])
PHP脚本:

<?php
$kontrah = urlencode($_POST['kontrah']);
$telefon = urlencode($_POST['telefon']);
$opis = urlencode($_POST['opis']);
$afakt = urlencode($_POST['afakt']);

$url = 'https://hetman.e4b.com.pl/api/services/app/zlecenie/FormAddZlecenie?kontrah='.$kontrah.'&telefon='.$telefon.'&opis='.$opis.'&afakt='.&afakt;

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);


$results = curl_exec($ch);

curl_close($ch);
?>

有几个问题:

  • 您的服务器需要的是
    application/x-www-form-urlencoded
    请求,而不是JSON请求。响应是JSON,但请求不是

  • 当我使用
    hetman.pl
    URL时,它重定向到
    www.hetman.pl
    ,但将
    POST
    替换为
    GET
    。当我直接向
    www.hetman.pl
    发送请求时,我收到了不同的消息。不过我看不懂,所以我不能评论这是好是坏

  • 与当前问题无关,Swift代码可以稍微整理一下,分别用
    URL
    URLRequest
    替换
    NSURL

  • 综合起来,你会得到如下结果:

    let parameters = ["kontrah" : kontrah, "telefon" : telefon, "opis" : selectedvalue, "afakt" : selectedafakt]
    
    let url = URL(string: "http://www.hetman.pl/ios/post2.php")!
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Accept")
    request.setValue("application/x-www-form-urlencoded; charset=utf-8", forHTTPHeaderField: "Content-Type")
    request.setBodyContent(parameters)
    
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {
            print(error ?? "Unknown error")
            return
        }
    
        do {
            let t  = try JSONSerialization.jsonObject(with: data) as? [String:AnyObject]
            print(t ?? "Invalid")
        } catch {
            print("Error  43-> \(error)")
        }
    }
    task.resume()
    
    在哪里


    您是否尝试使用断点并检查kontrah、telefon和其他变量是否为空?您的Swift代码中存在一些小的、不相关的问题(例如使用
    URL
    URLRequest
    ,而不是
    NSURL
    NSURLRequest
    ),但它基本上看起来很好。不过,PHP看起来很可疑。(如果你正在构建一个
    POST
    请求,为什么要在URL中添加
    $kontrah
    等?
    $fields\u string
    集在哪里?)但是你说你的Android应用程序调用的是同一个PHP?Android应用程序调用的是同一个PHP(PHP文件不是我的工作,而是另一家公司的程序员)。还有一件事。这段代码在9月份运行得很好,我不知道发生了什么。@Rob尝试使用直接URL,但结果相同。PHP的目的是只传递数据库可以识别的数据。@Rob我无法复制和粘贴PHP代码,不得不手动编写,但在这里错过了它。我的错。他们在密码里哦,老兄,非常感谢!每次发送请求时,我都会收到一封电子邮件,看看您投入了多少时间。再次感谢!你真棒
    let parameters = ["kontrah" : kontrah, "telefon" : telefon, "opis" : selectedvalue, "afakt" : selectedafakt]
    
    let url = URL(string: "http://www.hetman.pl/ios/post2.php")!
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Accept")
    request.setValue("application/x-www-form-urlencoded; charset=utf-8", forHTTPHeaderField: "Content-Type")
    request.setBodyContent(parameters)
    
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {
            print(error ?? "Unknown error")
            return
        }
    
        do {
            let t  = try JSONSerialization.jsonObject(with: data) as? [String:AnyObject]
            print(t ?? "Invalid")
        } catch {
            print("Error  43-> \(error)")
        }
    }
    task.resume()
    
    extension URLRequest {
    
        /// Populate the HTTPBody of `application/x-www-form-urlencoded` request
        ///
        /// - parameter parameters:   A dictionary of keys and values to be added to the request
    
        mutating func setBodyContent(_ parameters: [String : String]) {
            let parameterArray = parameters.map { (key, value) -> String in
                let encodedKey   = key.addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed)!
                let encodedValue = value.addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed)!
                return "\(encodedKey)=\(encodedValue)"
            }
            httpBody = parameterArray
                .joined(separator: "&")
                .data(using: .utf8)
        }
    }
    
    extension CharacterSet {
    
        /// Character set containing characters allowed in query value as outlined in RFC 3986.
        ///
        /// RFC 3986 states that the following characters are "reserved" characters.
        ///
        /// - General Delimiters: ":", "#", "[", "]", "@", "?", "/"
        /// - Sub-Delimiters: "!", "$", "&", "'", "(", ")", "*", "+", ",", ";", "="
        ///
        /// In RFC 3986 - Section 3.4, it states that the "?" and "/" characters should not be escaped to allow
        /// query strings to include a URL. Therefore, all "reserved" characters with the exception of "?" and "/"
        /// should be percent-escaped in the query string.
        ///
        /// - parameter string: The string to be percent-escaped.
        ///
        /// - returns: The percent-escaped string.
    
        static var urlQueryValueAllowed: CharacterSet = {
            let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4
            let subDelimitersToEncode = "!$&'()*+,;="
    
            var allowed = CharacterSet.urlQueryAllowed
            allowed.remove(charactersIn: generalDelimitersToEncode + subDelimitersToEncode)
    
            return allowed
        }()
    
    }