2017-10-04 4 views
4

Alamofireを使用すると、完全なファイルをダウンロードする前にヘッダー応答を処理する機能を持つことはできますか?例えばAlamofireはすべてのデータを受信する前にヘッダーを検証します(全身)

私たちのアプリは、複数のページに同じ要素を使用しています。これらの要素は、要求を使用して収集されます。各リクエストにはそれぞれ独自のハッシュ(md5チェックサム)があります。私たちはヘッダーでこのハッシュを送信しています&キャッシュシステムでハッシュが認識された場合、要求を中止したいと思います。

実装例

APIManager.sharedManager.request(url, method: method, parameters: parameters) 

      .doSomethingHere { 
      //I want to read the headers here, before the data is fetched from the server. 
      //There needs to be an option here to cancel the request. 
      } 

      .responseJSON { response in 
      //If the request isn't cancel in the function above. The data should be here. 
      } 
} 

編集:コードHTTPレスポンスのステータスコードを取得し、それを確認するには、次のソリューション(Alamofire実装SWIFT 3)

APIManager.sharedManager.delegate.dataTaskDidReceiveResponse = 
     {(session:URLSession, dataTask:URLSessionDataTask, response:URLResponse) -> URLSession.ResponseDisposition in 

      if let httpResponse = response as? HTTPURLResponse { 
       //Do something with headers here. If you don't want to continue the request: 
       return URLSession.ResponseDisposition.cancel 

      }  

      return URLSession.ResponseDisposition.allow 
    } 

APIManager.sharedManager.request(url, method: method, parameters: parameters) 
       .responseJSON { response in 
       //Response contains no data if it was canceled. 
       } 
    } 
+0

あなただけが2つの要求を使用して欲しいものを達成することができます。応答ヘッダーは応答自体の一部です。したがって、応答を取得する前にヘッダーを確認するにはどうすればよいですか? –

+0

こんにちはDavid。私のタイトルは間違っていた。私は、応答ヘッダーを検証し、完全な応答本体をダウンロードするかどうかを決定したいと思います。 – Bas

+0

@DávidPásztorによれば、応答の前にヘッダーを取得することはできません。ヘッダーは応答の一部です。 2つの要求を使用するか、サーバー側で処理する必要があります。ヘッダーが検証されていない場合、エラーメッセージまたはステータスコードなどを送信できます(エラーメッセージまたはステータスコードなど) この印刷を使用してすべてのヘッダーを表示できます(response.response?.allHeaderFields) –

答えて

2

ヘッダーは実際に応答の一部なので、これを行うには2つの要求をする必要があります。

これは、あなたが避けたがっていることであるというコメントから集まります。 この場合、リクエスト自体にハッシュを送信することができます。次に、サーバーはデータを返すかどうかを決定します。

  1. を要求してハッシュを送る:簡単にするために

  2. サーバーは、ハッシュが存在するかどうかを確認します。
  3. 空の応答(または状況コード)がある場合はそれを返し、存在しない場合は応答します。

EDIT:

より良い解決策は、あなたがURLSessionDataDelegateurlSession(_:dataTask:didReceive:completionHandler:)方法を使用することができます ...しかしあります。

ヘッダーに返されたハッシュを確認できます。次に、このメソッドの完了ハンドラで、タスクを続行するかキャンセルするかを示す定数を渡します。その詳細についてはhere

EDIT 2:

それはまだこのような方法で適用されていないので、それは今のところほとんど免許のない領土だが、HTTP/2サーバープッシュプロトコルを使用して、別の解決策は、まだあります。

サーバーをプッシュすると、サーバーは最初の応答とともに「プッシュプロミス」を送信します。これらの約束は、サーバが送信する後続の応答についてクライアントに知らせる小さなフレームです。 この場合、最初の応答としてハッシュを返し、実際のデータに対してプッシュプロミスを返すことができます。

さらに読書:

+0

これは私たちのバックアップ計画ですが、キャッシュされた複数の応答が存在する可能性があるため、私はこの方法をお勧めしません。 たとえば、リクエストhttp://server-url.com/request/example/request/には100の異なる応答があります。あなたの解決策では、要求と一緒に100のハッシュを送る必要があります。 – Bas

+0

ええ、右のように見えません。私は別の解決策で答えを編集しました。要件に合ったものになるはずです。 – NSAdi

+0

あなたの編集は私が探していたものです。私は私の最初のポストを更新しました。 – Bas

-2

使用

Alamofire.request(urlString) 
    .responseString { response in 
     print("Success: \(response.result.isSuccess)") 
     print("Response String: \(response.result.value)") 

     var statusCode = response.response?.statusCode 
     if let error = response.result.error as? AFError { 
      statusCode = error._code // statusCode private     
      switch error { 
      case .invalidURL(let url): 
       print("Invalid URL: \(url) - \(error.localizedDescription)") 
      case .parameterEncodingFailed(let reason): 
       print("Parameter encoding failed: \(error.localizedDescription)") 
       print("Failure Reason: \(reason)") 
      case .multipartEncodingFailed(let reason): 
       print("Multipart encoding failed: \(error.localizedDescription)") 
       print("Failure Reason: \(reason)") 
      case .responseValidationFailed(let reason): 
       print("Response validation failed: \(error.localizedDescription)") 
       print("Failure Reason: \(reason)") 

       switch reason { 
       case .dataFileNil, .dataFileReadFailed: 
        print("Downloaded file could not be read") 
       case .missingContentType(let acceptableContentTypes): 
        print("Content Type Missing: \(acceptableContentTypes)") 
       case .unacceptableContentType(let acceptableContentTypes, let responseContentType): 
        print("Response content type: \(responseContentType) was unacceptable: \(acceptableContentTypes)") 
       case .unacceptableStatusCode(let code): 
        print("Response status code was unacceptable: \(code)") 
        statusCode = code 
       } 
      case .responseSerializationFailed(let reason): 
       print("Response serialization failed: \(error.localizedDescription)") 
       print("Failure Reason: \(reason)") 
       // statusCode = 3840 ???? maybe.. 
      } 

      print("Underlying error: \(error.underlyingError)") 
     } else if let error = response.result.error as? URLError { 
      print("URLError occurred: \(error)") 
     } else { 
      print("Unknown error: \(response.result.error)") 
     } 

     print(statusCode) // the status code 
} 
+0

これは全く質問に答えません。問題は、ヘッダーを受け取った後、条件付きで要求を中止することです。これはHTTPステータスコードに関するものではありません。 – chocochaos

関連する問題