1

Swift를 사용하여 정말 기본적인 iOS 앱을 만들려고합니다. 처음 시작합니다. 그것의 대다수는 정말로 곧장 앞으로 나아 갔다. 앱을 내 API 또는 일반적으로 어떤 사이트와도 통화 할 수있는 악몽이 가득했습니다. 그 오류Swift : 웹 API와 통신 할 때 오류가 발생했습니다.

I '가

 NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{  (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in 
     println(NSString(data: data, encoding: NSUTF8StringEncoding)) 
    }) 

는 "(: 데이터 인코딩 NSUTF8StringEncoding 데이터)는 NSString'이다 :

제가 사용하고 코드 및 erroring된다 특히 코드 내가 찾을 수있는 많은 튜토리얼을 살펴 보았는데, 모두 똑같은 문제를 나에게 돌려 준다. 내가 말하는 오류 얻을 :

NSURLErrorDomain - 코드 : 4294966291

나는 또한있는 'EXC_BAD_INSTRUCTION'오류 얻을 : 솔루션에 저를 인도하지 않은 EXC_1386_INVOP, 서브 코드 = 0x0으로을 (... 이것이

제가 바로 내 셋업에서 뭔가를하지 않은, 또는 뭔가가 내 환경 설정에서 켜져 있어야하거나, 내 코드는 반대로 그 라인을 따라 뭔가 생각하게

... 내 전체 코드 :

,451,515,
var URL: NSURL = NSURL(string: "http://stackoverflow.com") 

    var request:NSMutableURLRequest = NSMutableURLRequest(URL:URL) 
    request.HTTPMethod = "POST" 

    var bodyData = "key1=value&key2=value&key3=value" 

    println(URL) 
    println(bodyData) 

    request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding); 
    let queue:NSOperationQueue = NSOperationQueue() 

    NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in 
     println(NSString(data: data, encoding: NSUTF8StringEncoding)) 
    }) 

업데이트 :

sendAsynchronousRequest error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo=0x7beafcc0 {NSErrorFailingURLStringKey= http://stackoverflow.com , _kCFStreamErrorCodeKey=57, NSErrorFailingURLKey= http://stackoverflow.com , NSLocalizedDescription=The network connection was lost., _kCFStreamErrorDomainKey=1, NSUnderlyingError=0x7d154ca0 "The network connection was lost."}

+0

게시하기 전에 URL을 변경 했습니까? 위는 나를 위해 일한다. 나는 항상'Content-Type'을 설정했습니다. 'request.setValue ("application/x-www-form-urlencoded", forHTTPHeaderField : "Content-Type")', 그러나 나는 이것이 문제라고 생각하지 않는다. – Rob

+0

이것은 문자 그대로의 코드입니다! – user2707631

+0

다음으로 [Charles] (http://charlesproxy.com)와 함께 실행하고 응답이 어떻게 표시되는지 확인합니다. – Rob

답변

2

datanil입니다처럼 소리 : 롭의 코드를 사용하여이

, 나는 인쇄 오류가 발생 알고있다. error 개체의 내용을 살펴보면 그 이유를 알 수 있습니다. 대부분 request에는 문제가있을 수 있지만 문제를 재현 할 수 없으면 진단하기가 어렵습니다. 당신이 좀 더 진단 정보와 요청을 수행하려는 경우

어쨌든, (상태 코드 등, (200)가 아닌 경우에 문제가 있는지 error를 기록, statusCoderesponse 로그) :

NSURLConnection.sendAsynchronousRequest(request, queue: queue) { 
    response, data, error in 

    if data == nil { 
     println("sendAsynchronousRequest error: \(error)") 
     return 
    } 

    if let httpResponse = response as? NSHTTPURLResponse { 
     let statusCode = httpResponse.statusCode 
     if statusCode != 200 { 
      println("sendAsynchronousRequest status code = \(statusCode); response = \(response)") 
     } 
    } 

    println(NSString(data: data, encoding: NSUTF8StringEncoding)) 
} 

수정 된 질문에

, 당신은 -1005보고 된 결과 NSError, 공유 (생각해 보면, 이전에 우리를 보여 4294966291 오류 코드와 동일, 후자는 -1005의 부호없는 정수 표현되는). 이 오류 (설명대로)는 NSURLErrorNetworkConnectionLost (즉 kCFURLErrorNetworkConnectionLost)이며 설명서에는 "진행중인로드 중 클라이언트 또는 서버 연결이 끊어지면 반환됩니다."

불행히도이 오류는 다양한 문제에 사용되며 설명하는 오류를 재현 할 수 없으므로 진단하기가 어렵습니다.요청에서 누락


한 것은 Content-Type의 스펙입니다

request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 

당신이 설명하는 문제가 발생하지 겠지만, 항상의 서버를 알리는 좋은 방법입니다 요청 유형.

+0

고마워 Rob, 나는 얻는다 : data = (NSData!) nil - 그게 무슨 뜻인가? – user2707631

+0

예. 'nil'이기 때문에'error' 객체를 검사하십시오. – Rob