2

iOS アプリに次の Swift コードがあります。

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)") }
        }
        //[...]

Web サービス API への呼び出しが成功すると、これresponse!.statusCodeは正常に機能します。正しく設定さdataれ、完了ハンドラーに渡された は、JSON から有用なオブジェクトに解析できます。

ただし、サーバーの応答が 500 などのエラーの場合dataは、0 バイトであり、応答の本文ではなくヘッダー情報しか表示されません。

プロキシ アプリケーションCharlesを使用してシミュレーターから収集した応答の例を次に示します。

HTTP/1.1 500 内部サーバー エラー
Transfer-Encoding: チャンク
サーバー: Microsoft-IIS/8.0
X-Powered-By: ASP.NET
Set-Cookie: ARRAffinity=00000000000000000008888888888888888888888aaaaaaaaaaaaaaaaa;Path=/;Domain=blah-testing.azurewebsites.net
Date : 2016 年 7 月 21 日 (木) 05:57:44 GMT

{"ExceptionType":"Exception","Message":"Not on your Nelly","StackTrace":" D:\Users\timregan\Source\Repos\ServerSideCode\Blah の Blah.Controllers.CustomersController.Get() で\ApiControllers\CustomersController.cs: 37 行目\r\n at lambda_method(Closure , Object , Object[] )\r\n at Microsoft.AspNetCore.Mvc.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)\ r\n at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__28.MoveNext()\r\n--- 例外がスローされた前の場所からのスタック トレースの終わり ---\r\n at System.Runtime.ExceptionServices .ExceptionDispatchInfo.Throw()\r\n at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__18.MoveNext()\r\n--- 例外がスローされた前の場所からのスタック トレースの終わり ---\r\システムで n。Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)\r\n で System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)\r\n で System.Runtime.CompilerServices.TaskAwaiter.GetResult()\r\n でMicrosoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext()\r\n--- 例外がスローされた前の場所からのスタック トレースの終わり ---\r\n System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) で\r\n System.Runtime.CompilerServices.TaskAwaiter.GetResult() で\r\n Microsoft.AspNetCore.Authentication.AuthenticationMiddleware でHandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.GetResult()\r\n at Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext()\r\n--- スタック トレースの終了例外がスローされた前の場所から ---\r\n System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク) で\r\n System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク) で\r\n System.Runtime.CompilerServices.TaskAwaiter.GetResult()\r\n で Microsoft.AspNetCore.Authentication.AuthenticationMiddleware でHandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.GetResult()\r\n at Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext()\r\n--- スタック トレースの終了例外がスローされた前の場所から ---\r\n System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク) で\r\n System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク) で\r\n System.Runtime.CompilerServices.TaskAwaiter.GetResult()\r\n で Microsoft.AspNetCore.Authentication.AuthenticationMiddleware でTaskAwaiter.ThrowForNonSuccess(タスク タスク)\r\n System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク) で\r\n System.Runtime.CompilerServices.TaskAwaiter.GetResult()\r\n で Microsoft.AspNetCore. Authentication.AuthenticationMiddlewareTaskAwaiter.ThrowForNonSuccess(タスク タスク)\r\n System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク) で\r\n System.Runtime.CompilerServices.TaskAwaiter.GetResult()\r\n で Microsoft.AspNetCore. Authentication.AuthenticationMiddleware1.<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.AuthenticationMiddleware1.d__18.MoveNext()\r\n--- 例外がスローされた前の場所からのスタック トレースの終わり ---\r\n System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) で\r\n System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n で Blah.Startup.<>c.<b__6_0>d.MoveNext() で D:\Users\timregan\Source\Repos\ServerSideCode\Blah \Startup.cs:59行目","StatusCode":500}

しかし、Xcode では、同じ応答がはるかに少なくなります。ヘッダー要素はすべてオブジェクトにありますが、完了ハンドラーNSHTTPURLResponseへの他のパラメーターには何もありません: is 0 バイトとisです。サーバー エラー スタック トレースを含む応答の本文はどこにあるのでしょうか? Swift でアクセスするにはどうすればよいですか?dataTaskWithRequestdataerrornil

4

1 に答える 1