HTTP-соединение с переполнением Swift / Stack

Всякий раз, когда я отправляю HTTP-запрос из моего приложения Swift на мой локальный сервер, он всегда отвечает статусом 500, пустым Optional() тело и текст / html Content-Type. Я новичок в использовании HTTP таким образом, поэтому я не уверен, где может быть ошибка. Я установил pecl-http и (я думаю) правильно настроил его. Я также (думаю), что я правильно устанавливаю тело и тип контента в коде PHP. Я последовал за Свифтом этот урок для моего кода 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

Решение

Включите отчеты об ошибках в PHP. Увидеть Как получить ошибки PHP для отображения?

Очевидно, что у вас просто ошибка, которая не позволяет вашему PHP работать правильно, но PHP настроен так, чтобы не отправлять вам информацию об ошибке. Очевидно, что $sucsess ссылка неверна, но могут быть и другие проблемы. (Вы поделились только небольшим количеством PHP, поэтому у вас нет возможности узнать, что еще может скрываться там.) Изменив php.ini для отображения ошибок, вам не нужно будет угадывать, в чем причина проблемы. ,

1

Другие решения

Я сделал несколько шагов, чтобы заставить код работать:

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, мне нужно было только установить Content-Type и затем повторить $success,

HttpResponse::setContentType("application/json");
echo $success;
0

По вопросам рекламы [email protected]