每当我从我的Swift应用程序向我的本地服务器发送HTTP请求时,它总是以500状态,空Optional()
正文和text / html Content-Type响应。我是以这种方式使用HTTP的新手,所以我不确定错误可能在哪里。我已经安装了pecl-http和(我认为)我已经正确配置了它。我也(想)我正在PHP代码中正确设置正文和内容类型。我跟随this tutorial的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();
}
答案 0 :(得分:1)
在PHP中打开错误报告。见How do I get PHP errors to display?
显然,您只是犯了一个错误,导致PHP无法正常运行,但PHP配置为不向您发送错误信息。显然$sucsess
引用是错误的,但也可能存在其他问题。 (你只是分享了一些PHP,所以无法知道还有什么可能潜伏在那里。)通过改变php.ini来显示错误,你不必猜测源代码是什么问题是。
答案 1 :(得分:0)
我采取了多个步骤来使代码工作:
1)错误的pecl_http版本:我有v2,它不支持PHP HTTP Extension Documentation中的功能。我不得不download and install v1使用文档中的函数。
2)未正确处理POST请求:一旦连接正常工作,我需要获取请求正文,对其进行解码,并将其分配给$username
和{{1变量。
$password
3)没有正确发送响应:我只需要设置Content-Type然后回显$body = http_get_request_body();
$body = json_decode($body);
$username = $body->{"username"};
$password = $body->{"password"};
,而不是为HttpResponse调用所有这些方法。
$success