Alamofire 在接收所有数据之前验证标头(全文)

Bas*_*Bas 6 request http-headers ios swift 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.
            }
}
Run Code Online (Sandbox Code Playgroud)

编辑:解决方案(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. 
                }
    }
Run Code Online (Sandbox Code Playgroud)

NSA*_*Adi 3

标头实际上是响应的一部分,因此您可能必须发出两个请求才能执行此操作。

我从评论中得知这是您想要避免的事情。在这种情况下,您可以做的是在请求本身中发送哈希值。然后服务器决定是否返回数据。

为了简化:

  1. 发送请求中的哈希值。
  2. 服务器检查哈希值是否存在
  3. 如果有,则为空响应(或某些状态代码);如果没有,则以数据响应。

编辑 :

不过,有一个更好的解决方案...您可以urlSession(_:dataTask:didReceive:completionHandler:)使用URLSessionDataDelegate.

您可以检查标头中返回的哈希值。然后只需在此方法的完成处理程序中传递一个常量,指示是继续任务还是取消任务。更多内容请参见此处

编辑2:

还有另一种使用 HTTP/2 服务器推送协议的解决方案,尽管它目前几乎是一个未知领域,因为它尚未以这种方式应用。

通过服务器推送,服务器会发送“推送承诺”以及第一个响应。这些承诺是小帧,通知客户端服务器将发送的后续响应。因此,在这种情况下,您可以返回哈希值作为第一个响应,并返回实际数据的推送承诺。

进一步阅读: