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.AuthenticationMiddleware
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--- 例外がスローされた前の場所からのスタック トレースの終わり ---\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 でアクセスするにはどうすればよいですか?dataTaskWithRequest
data
error
nil