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)
标头实际上是响应的一部分,因此您可能必须发出两个请求才能执行此操作。
我从评论中得知这是您想要避免的事情。在这种情况下,您可以做的是在请求本身中发送哈希值。然后服务器决定是否返回数据。
为了简化:
编辑 :
不过,有一个更好的解决方案...您可以urlSession(_:dataTask:didReceive:completionHandler:)使用URLSessionDataDelegate.
您可以检查标头中返回的哈希值。然后只需在此方法的完成处理程序中传递一个常量,指示是继续任务还是取消任务。更多内容请参见此处。
编辑2:
还有另一种使用 HTTP/2 服务器推送协议的解决方案,尽管它目前几乎是一个未知领域,因为它尚未以这种方式应用。
通过服务器推送,服务器会发送“推送承诺”以及第一个响应。这些承诺是小帧,通知客户端服务器将发送的后续响应。因此,在这种情况下,您可以返回哈希值作为第一个响应,并返回实际数据的推送承诺。
进一步阅读:
| 归档时间: |
|
| 查看次数: |
438 次 |
| 最近记录: |