2014-12-21 2 views
0

Swift 앱에서 내 로컬 서버로 HTTP 요청을 보낼 때마다 항상 500 상태, 비어있는 Optional() 본문 및 text/html Content-Type으로 응답합니다. 이 방법으로 HTTP를 처음 사용하기 때문에 오류가 어디에 있는지 확신 할 수 없습니다. 나는 pecl-http를 설치했고 올바르게 설정했다. 나 또한 (생각) 나는 PHP 코드에서 본문과 내용 유형을 올바르게 설정하고있다. Swift 코드에 this tutorial의 Swift 부분을 따라 PHP를 직접 만들었습니다. 나는 그 문제가 어디 있는지 전혀 모른다. 내 오류는 응답을 보내거나받는 것으로 생각하므로 첨부 한 코드를 참조하십시오.Swift/PHP와의 HTTP 연결

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 HTTP Extension Documentation의 기능을 지원하지 않습니다 V2를했다. 설명서의 기능을 사용하려면 download and install v1해야했습니다.

2) 하지 가공 POST 요청 제대로 : 나는 연결 작업을 가지고 일단, 나는, 요청 본문을 가져 오기를 디코딩하고, $username$password 변수에 할당 할 필요가 있었다.

$body = http_get_request_body(); 
$body = json_decode($body); 
$username = $body->{"username"}; 
$password = $body->{"password"}; 

3) 제대로 응답을 전송하지 : 나는 단지 콘텐츠 형식을 설정하는 데 필요한 다음 $success 에코 오히려 HttpResponse에 대한 모든 메소드를 호출보다.

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

PHP에서 오류보고를 활성화합니다. How do I get PHP errors to display?

분명히 PHP가 올바르게 실행되지 못하게하는 실수가 있지만 PHP는 오류 정보를 보내지 않도록 구성되어 있습니다. 분명히 $sucsess 참조가 잘못되었지만 다른 문제가있을 수 있습니다. (당신은 단지 약간의 PHP를 공유 했으므로 거기에 숨어있는 다른 것을 알 수있는 방법이 없습니다.) php.ini를 변경하여 오류를 표시하면 문제의 원인을 추측 할 필요가 없습니다 .

1) 잘못된 pecl_http 버전 :