每当我从我的 Swift 应用程序向我的本地服务器发送 HTTP 请求时,它总是以 500 状态、空Optional()
正文和文本/html 内容类型进行响应。我是以这种方式使用 HTTP 的新手,所以我不确定错误可能在哪里。我已经安装了pecl-http,并且(我认为(我已经正确配置了它。我也(认为(我在 PHP 代码中正确设置了正文和内容类型。我按照本教程的 Swift 部分编写了我的 Swift 代码,并自己创建了 PHP;我只是不知道问题出在哪里。我认为我的错误在于发送/接收响应,所以这就是我附加的代码。
HTTP响应
Response: <NSHTTPURLResponse: 0x7f8b44828b80> { URL: http://localhost/practicejournal/includes/php/json_login.php } { status code: 500, headers {
Connection = close;
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Sun, 21 Dec 2014 17:12:53 GMT";
Server = "Apache/2.4.9 (Unix) PHP/5.5.14";
"X-Powered-By" = "PHP/5.5.14";
} }
Body: Optional()
The operation couldn’t be completed. (Cocoa error 3840.)
Error could not parse JSON: 'Optional()'
快速代码接收响应
var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
println("Response: '(response)")
var strData = NSString(data: data, encoding: NSUTF8StringEncoding)
println("Body: '(strData)")
var err: NSError?
var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSDictionary
if(err != nil) {
println(err!.localizedDescription)
let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
println("Error could not parse JSON: ''(jsonStr)'")
} else {
if let parseJSON = json {
var success = parseJSON["success"] as? Int
println("Success '(success)")
} else {
let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
}
}
})
PHP 代码发送响应
//If Login is successful
$conn = null;
$success = 1;
HttpResponse::status(200);
HttpResponse::setContentType("application/json");
HttpResponse::setData($success);
HttpResponse::send();
//If Login is unsuccessful
function loginError() {
$conn = null;
$sucsess = 0;
HttpResponse::status(200);
HttpResponse::setContentType("application/json");
HttpResponse::setData($success);
HttpResponse::send();
}
在 PHP 中打开错误报告。请参阅如何显示 PHP 错误?
显然,您只是有一个错误,该错误阻止了PHP正常运行,但是PHP配置为不向您发送错误信息。显然,$sucsess
引用是错误的,但也可能存在其他问题。(你只分享了一点 PHP,所以无法知道还有什么可能潜伏在那里。通过更改 php.ini 以显示错误,您不必猜测问题的根源是什么。
我采取了多个步骤来使代码正常工作:
1(错误的pecl_http版本:我有v2,它不支持PHP HTTP扩展文档中的功能。我必须下载并安装 v1 才能使用文档中的功能。
2(未正确处理POST请求:一旦连接正常工作,我需要获取请求正文,对其进行解码,并将其分配给$username
和$password
变量。
$body = http_get_request_body();
$body = json_decode($body);
$username = $body->{"username"};
$password = $body->{"password"};
3(没有正确发送响应:我不需要为HttpResponse调用所有这些方法,我只需要设置内容类型,然后回显$success
。
HttpResponse::setContentType("application/json");
echo $success;