2017-03-01 13 views
0

NSURLSessionクラスを使用してSwiftでHTTP経由でREST APIと通信するネットワークモデルを実装する作業を現在進めています。NSURLSessionデータタスクの応答処理

要求を調製するために、私はこのコードを使用します。今、私はそのようにリクエスト送信しています

var request = URLRequest(url: requestURL) // url is "http://somethingsomething... 
    request.httpMethod = "POST" 
    request.setValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.httpBody = body 

session.dataTask(with: request) { data, response, error in 
     // Parse the data, response and error 
    }.resume() 

を私の問題は、私はのhttpStatusCodeを確認したいということですエラーが発生する可能性があることを通知するために、応答が返されますが、完了ブロック内のresponseはであり、HTTPURLResponseではありません。つまり、responseをタイプHTTPURLResponseにキャストする必要があります。これまでのところ、2つの方法にアプローチしました。まず、「HTTPURLResponseにキャストできませんでした」シナリオを処理する別のエラーシナリオを追加します。もう1つの方法はキャストを単にHTTPURLResponseに強制します。最初のオプションはよかったようですが、無駄なコードを追加するだけかもしれません。なぜなら、おそらくキャストは常に成功するからです。

基本的には、私の質問です - 私はHTTPサーバーに要求を送信する場合、応答は常にHTTPURLResponseタイプのでしょうか?または、responseオブジェクトが別の型であるか、またはnilである状況を処理するコードを実装する必要がありますか?

また、私の実装では、完了ブロックがnilではないエラーを返した場合、何かをキャストしようとする前にフローが戻ってくることは言うまでもないでしょう。

答えて

0

私はこれがあなたが必要としていると信じています。

session.dataTask(with: request) { data, response, error in 
    // Parse the data, response and error 
    if let httpResponse = response as? HTTPURLResponse { 
     //here it is 
     print(httpResponse.statusCode) 
    } 
}.resume() 

私はキャストが私の知識に失敗したことはありませんでした。なぜ私はURLResponseとHTTPURLResponseが1つのクラスにマージされないのか分かりませんが、HTTPURLResponseは、私の知る限り常にレスポンスをキャストできるサブクラスです。

+0

その場合、私は未処理のシナリオを持っています。ここでは、 'httpResponse = responseを? HTTPURLResponse'が失敗します。私の質問です - 私は100%HTTPサーバーと対話している場合、失敗しないことを確認することができますか? – user3581248

+0

私はそれを毎日HTTPサーバーとやりとりして使用しますが、決して失敗しません。 – Sethmr

+0

@ user3581248 - いいえ、それが 'HTTPURLResponse'であることを保証することはできません。なぜなら、もし' if let'または 'guard'を安全にunwrapする必要があるからです。エンドユーザはなぜそれが失敗したのか気にしないことを考えれば、私は 'if' /' guard'ステートメントで両方をチェックします。 'guardはhttpResponse = responseを? HTTPURLResponse、httpResponse.statusCode == 200 else {//ここでエラーを処理} '。 – Rob