2016-07-21 7 views
0

나는 내 iOS 앱에 다음 스위프트 코드를 가지고 :NSURLSession에서 500 오류의 응답 데이터는 어디에 있습니까?

session?.dataTaskWithRequest(urlRequest, completionHandler: { (data, response, error) -> Void in 
    if let httpResponse = response as? NSHTTPURLResponse { 
     var dataString:String? 
     if data != nil { 
      // Print the response as a string 
      dataString = String(data: data!, encoding: NSUTF8StringEncoding)! 
      if RequestManager.verbose { print("Response data: \(dataString)") } 
     } else { 
      if RequestManager.verbose { print("Response data: \(response?.description)") } 
     } 
     //[...] 

웹 서비스 API에 대한 호출은 성공이 잘 작동 할 때 : response!.statusCode 올바르게 설정하고 완료 핸들러에 전달 된 data이로 해석 될 수있다 JSON의 유용한 객체.

그러나 서버 응답이 오류 인 경우 (예 : 500이면, data은 0 바이트이며, 볼 수있는 것은 응답의 본문이 아니라 헤더 정보입니다. 여기

프록시 응용 프로그램 Charles를 사용하여 시뮬레이터에서 수집 예를 들어 응답입니다 :

HTTP/1.1 500
전송 인코딩이 내부 서버 오류 : 마이크로 소프트 IIS/8.0
:
서버를 청크 X-구동 - 기준 : ASP.NET
설정 쿠키 : ARRAffinity = 00000000000000000000888888888888888888888888aaaaaaaaaaaaaaaaaaaa; 경로 = /; 도메인 = blah-testing.azurewebsites.net
날짜 : 2016년 7월 21일 (목) 그리니치 표준시 05시 57분 44초

D : \ Users \ timregan \ Source \ Repos의 Blah.Controllers.CustomersController.Get()에서 "Exception", "예외", "메시지": "사용자의 Nelly에 없음", "StackTrace" Microsoft.AspNetCore.Mvc.Internal.ObjectMethodExecutor.Execute (Object target, Object [])에서 lambda_method (Closure, Object, Object [])에서 줄을 \ 37 \ r \ n 줄을 \ ServerSideCode \ Blah \ ApiControllers \ CustomersController.cs : ] 매개 변수) \ r \ n Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__28.MoveNext() \ r \ n --- 예외가 발생한 이전 위치의 스택 추적 끝 - 시스템의 \ r \ n .Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() \ r \ n Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__18.MoveNext() \ r \ n --- 예외가 발생한 이전 위치에서 스택 추적 끝 - - \ r \ n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (작업 작업) \ r \ n System.Runtime.Compiler에서 Services.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (작업 작업) \ System \ Runtime.CompilerServices.TaskAwaiter.GetResult() \ r \ n Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext() \ r \ n --- 예외가 발생한 이전 위치의 스택 추적 끝 - System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (작업 작업) \ System \ Run \ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (작업 작업)에서 \ r \ Microsoft.AspNetCore.Authentication.AuthenticationMiddleware의 System.Runtime.CompilerServices.TaskAwaiter.GetResult() \ r \ n에서 1.<Invoke>d__18.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware 1.d__18.MoveNext() \ r \ n --- 이전 위치에서 스택 추적 끝내기 예외가 Throw 된 곳 - System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task task) \ r \ n System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task task) \ blame에서 \ r \ n. 시작. <> c. < b__6_0> D의 d.MoveNext() : \ 사용자 \ timregan \ 소스 \ 레포 \ ServerSideCode \ ㅋ \ Startup.cs : 라인 (59) ","상태 코드 "

하지만 엑스 코드 500} 동일한 응답 가 훨씬 적습니다. 헤더 요소는 모두 NSHTTPURLResponse 개체에 있지만 완료 핸들러 dataTaskWithRequest의 다른 매개 변수는 아무 것도 없습니다. data은 0 바이트이고 errornil입니다. 서버 오류 스택 추적이있는 응답 본문이있는 곳 Swift에서 어떻게 액세스 할 수 있습니까?

+0

내 질문이 왜 투표에 실패했는지 알면 도움이 될 것입니다. 나는 분명한 함정에 빠졌다고 생각하지 않습니다. 아마도 iOS 태그가 너무 일반적 일 것입니다. – dumbledad

답변

0

기본적으로 IIRC IIRC는 200 헤더가 아닌 데이터를 요청하기 때문에 IIRC는 데이터를 요청하지 않으므로 다운로드하는 데 시간을 낭비하지 않습니다. 당신이 필요로하지 않는 신체 데이터.

  • URLSession:dataTask:didReceiveResponse:completionHandler: 대리자 메서드를 구현하고 항상 NSURLSessionResponseAllow를 반환합니다 실제로 본문 데이터를 매번 검색 할 경우

    .

  • URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler: 메서드를 구현하고 완료 처리기가 항상 새 요청으로 NULL을 전달하도록하여 리디렉션이 수행되지 않도록합니다.

나는 어딘가 다른 위임 방법을 잊고하지 않는 한, 충분해야한다 생각 .

+0

나는 그것들에 대한 구현을 추가했지만 호출되지 않기 때문에 감지 할 수있는 차이점이 없다. – dumbledad

+0

아 맞습니다. 또한 요청을 작성할 때 완료 핸들러를 제거하고 위임 메소드로 직접 처리해야합니다. 요청과 함께 완료 핸들러를 사용하면 didReceiveResponse : delegate 메소드가 호출되는 것을 방지 할 수 있습니다. 그리고 저는 여전히 이것이 문제를 해결할 것이라고 100 % 확신하지 못합니다. – dgatwood