使用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.
}
}
编辑:解决方案(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)
标题实际上是响应的一部分,因此您可能需要发出两个请求才能执行此操作。
我从评论中得知,这是你想要避免的。 在这种情况下,您可以做的是在请求本身中发送哈希。然后服务器决定是否返回数据。
简化:
编辑:
虽然有更好的解决方案......
您可以使用urlSession(_:dataTask:didReceive:completionHandler:)
的{{1}}方法。
您可以检查标头中返回的哈希值。然后在此方法的完成处理程序中传递一个常量,指示是继续执行任务还是取消它。更多关于here。
编辑2:
还有另一种使用HTTP / 2服务器推送协议的解决方案,虽然它现在已经非常未知,但它还没有以这种方式应用。
通过服务器推送,服务器发送"推送承诺"以及第一个回应。这些承诺是小框架,通知客户端服务器将发送的后续响应。 因此,在这种情况下,您可以将散列作为第一个响应和实际数据的推送承诺返回。
进一步阅读: