Php Swift 3函数用于发布数据,当我从服务器收到JSon应答时出现错误
我在Swift 3中有一个将数据发布到PHP服务器的函数。PHP服务器向iOS发送一个JSon应答,我有一个错误 这是我的职责:Php Swift 3函数用于发布数据,当我从服务器收到JSon应答时出现错误,php,ios,json,swift3,Php,Ios,Json,Swift3,我在Swift 3中有一个将数据发布到PHP服务器的函数。PHP服务器向iOS发送一个JSon应答,我有一个错误 这是我的职责: func sendRequestPost(urlString: String, dataToPost: String, completion: @escaping (_ dictionary: NSDictionary?, _ error: Error?) -> Void) { DispatchQueue.global(qos: .background
func sendRequestPost(urlString: String, dataToPost: String, completion: @escaping (_ dictionary: NSDictionary?, _ error: Error?) -> Void) {
DispatchQueue.global(qos: .background).async {
var request = URLRequest(url: URL(string: urlString)!)
let postString = dataToPost
request.httpMethod = "POST"
request.httpBody = postString.data(using: .utf8)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else { // Check for fundamental networking error
print("error=\(error)")
completion(nil, error)
return
}
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // Check for http(s) errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(response)")
// make error here and then
completion(nil, error)
return
}
let responseString = String(data: data, encoding: .utf8)
print("responseString : \(responseString)!")
DispatchQueue.main.async {
print("DispatchQueue.main.async")
do {
print("enter do")
let jsonDictionary:NSDictionary = try JSONSerialization.jsonObject(with: data, options: []) as! [String: Any] as NSDictionary
print("jsonDictionary")
print(jsonDictionary)
completion(jsonDictionary, nil)
} catch {
print("CATCH ERROR !")
completion(nil, error)
}
}
}
task.resume()
}
}
例如,我这样调用我的函数:
let url = "https://mywebsite.com/signup/ios/signup.php"
let postData = "username=\(txtUsername.text!)&password=\(txtPassword.text!)&confirmPassword=\(txtConfirmPassword.text!)&email=\(txtEmail.text!)&firstname=\(txtFirstname.text!)&lastname=\(txtLastname.text!)"
sendRequestPost(urlString: url, dataToPost: postData) {
dictionary, error in
print("---directory---")
print(dictionary)
print("---error---")
print(error)
print("==========")
这是我在控制台中看到的:
响应字符串:“{\'异常\':false,\'成功\':false,\'状态\':-9,\'消息\':\'此用户名已存在!\,\'确认消息\':\'空\',\'html \':'空\',\'数据\':'boblongueuil \'}!
DispatchQueue.main.async
---输入DO:
抓住错误!
---目录---
无
---错误---
可选(错误域=NSCOCAERRORDOMAIN Code=3840“JSON文本未以数组或对象开头,允许未设置片段的选项。”UserInfo={NSDebugDescription=JSON文本未以数组或对象开头,允许未设置片段的选项。})
因此,在调用此函数后,如何返回JSon字符串以查看注册是否正常或注册是否有问题(在这种情况下,数据库中已经存在用户名)。我将答案从我的PHP服务器更改为数组。删除可选添加的转义字符后,您的
responseString
将被括在双引号中。它是一个JSON字符串,包含JSON对象的文本表示形式——双重编码。我建议您重新配置您的PHP服务器,因为双重编码的JSON对服务器和客户端都是低效的,这会消耗更多的时间和空间。现在PHP服务器返回的数组结果是:responseString:“{\'exception\'”:false,\'success\':false,\'status\':-9,\'message\':\“此用户名已经存在!\”,“confirmMessage\”:“null\”,“html\:”空\“,\”数据\“:\”boblongueuil \“}”!DispatchQueue.main.async---输入DO:CATCH错误!可选(错误域=NSCOCAERRORDOMAIN Code=3840“JSON文本未以数组或对象开头,允许未设置片段的选项。”UserInfo={NSDebugDescription=JSON文本未以数组或对象开头,允许未设置片段的选项。})为什么让jsonDictionary:NSDictionary行有一个错误?如果您得到输出responseString:“{…
从print(“responseString:\(responseString)!”)
,(它不是print(“responseString:\(responseString!)”
,但是如何打印它是不相关的)它的两端仍然包含双引号。请修复php端,否则您无法使用正确的JSON来处理代码。这正是我的php服务器返回的结果:$result=array('exception'=>false,'success'=>false,'status'=>-10,'message'=>'此电子邮件地址已存在于我们的系统中!','confirmMessage'=>'null','html'=>'null','data'=>$email);告诉PHP服务器端工程师,返回双重编码的JSON是一个糟糕的设计或错误,表明实现者技能低下,应该予以修复。