与Swift / PHP的HTTP连接

时间:2014-12-21 17:16:25

标签: php http swift

每当我从我的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();
}

2 个答案:

答案 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