gpt4 book ai didi

ios - Alamofire 在接收所有数据之前验证 header (完整主体)

转载 作者:搜寻专家 更新时间:2023-10-31 19:32:33 26 4
gpt4 key购买 nike

使用Alamofire,是否可以在下载完整文件之前具有处理 header 响应的功能?

例如:

我们的应用在多个页面上使用相同的元素。这些元素是使用请求收集的。每个请求都有自己的哈希值(md5 校验和)。我们在 header 中发送此散列,如果在缓存系统中识别出散列,我想中止请求。

示例实现

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.
}
}

最佳答案

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

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

简化:

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

编辑:

虽然有更好的解决方案...您可以使用 URLSessionDataDelegateurlSession(_:dataTask:didReceive:completionHandler:) 方法。

您可以检查 header 中返回的哈希值。然后只需在此方法的完成处理程序中传递一个常量,指示是继续执行任务还是取消任务。更多关于 here .

编辑 2:

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

对于服务器推送,服务器发送“推送 promise ”以及第一个响应。这些 promise 是一些小框架,用于通知客户端服务器将发送的后续响应。因此,在这种情况下,您可以返回哈希作为第一个响应和实际数据的推送 promise 。

进一步阅读:

关于ios - Alamofire 在接收所有数据之前验证 header (完整主体),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46566695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com