【问题标题】:eTag support using Alamofire 4使用 Alamofire 4 的 eTag 支持
【发布时间】:2017-04-21 17:45:47
【问题描述】:

我正在尝试在我的应用中启用 eTag 支持。 我在我的 swift 3 项目中使用 Alamofire 4。

似乎 eTag 是由 Alamofire 使用的 URLRequest 透明处理的:

NSURLCache and ETags

但它不起作用。

这是网络服务器发送的http头:

headers {
    Connection = "keep-alive";
    "Content-Length" = 47152;
    "Content-Type" = "application/json";
    Date = "Tue, 06 Dec 2016 22:43:18 GMT";
    Etag = "\"ecf38288be2f23f6710cafeb1f344b8c\"";
} })

你有什么提示吗?

非常感谢。

【问题讨论】:

  • 定义“它不起作用”

标签: ios swift3 alamofire etag


【解决方案1】:

默认情况下,缓存是开启的。如果您在应用内记录 HTTP 流量,您可能会看到缓存响应,而此时应用不会向服务器发出请求。

如果URLSession 决定返回缓存响应而不是转到服务器,您将看到相同的Date HTTP 响应标头。

为确保缓存正常工作,您应该检查应用和服务器之间的网络数据包。

【讨论】:

  • 我刚刚查看了来自herethis 图像。看起来这个工作客户端必须自动快速发出HEAD 请求。我的问题是如果您的服务器没有路由/实现HEAD 请求会发生什么?这是否意味着它根本不起作用,基本上每次你实际上会发出 GET 请求时——不管是否设置 cachePolicy:NSURLRequestUseProtocolCachePolicy
  • @Honey 在你的图片上,有一个不需要 HEAD 的路径。
  • ...直到响应过时。只有当它陈旧时,才会发出 HEAD。如果服务器不处理 HEAD,资源将被标记为已更改。你应该通过捕获 HTTP 数据包来调试它。
  • 谢谢 1. 什么是陈旧的默认计时器设置? 2分钟? 10分钟? 1天? 2. 如果实际数据改变了 10 次,但我们还没有达到我们的过期/过期时间,会发生什么?!
  • 3.我创建了一个示例项目,并且正在尝试测试该行为。我创建了一个URLRequest 并将其缓存策略设置为.useProtocolCachePolicy,然后在我的session.dataTask(with: request as URLRequest) { (data, response, error) in 中,我为我的重复请求打印了print(httpResponse.statusCode)print(httpResponse.allHeaderFields)statusCode 总是200 我猜这意味着没有缓存对吗?我也不知道如何理解标题。有什么我应该研究的特定键吗?
【解决方案2】:

这是使用 URLRequest 时的默认缓存策略。

如果你想改变这种行为并看到来自网络的“真实”响应,以便你可以自己处理eTag和statusCode,你只需将缓存策略更改为reloadIgnoringCacheData

var exampleRequest = try! URLRequest(url: route, method: .post, headers: headers)
// This is the important line.
exampleRequest?.cachePolicy = .reloadIgnoringCacheData

希望这对某人有所帮助!

【讨论】:

  • 你怎么能改变行为?您不只是建议完全忽略缓存吗?无论如何都下载?!
  • 我认为这取决于您的用例。如果您的后端(或者,一般来说,您正在调用的 API)总是以完整的响应回答 200,那么我同意您的观点,即您需要继续缓存。但是,如果您的后端实现了 HTTP-Conditional-Get(如果有任何更改,它会用完整的主体回答 200,如果没有任何变化,它会用空的主体回答 200),就像我的情况一样,而你需要访问响应的真实statusCode(因为在这种情况下你需要做一些特定的动作),你需要改变URLRequestcachePolicy。
  • 如果我理解正确,将 cachePolicy 设置为 reloadIgnoringCacheData 如果根据您的请求的 etag 标头没有任何更改,则将为您提供 304 并且没有 JSON 响应。但是如果 Alamofire 和 URLSession 自动处理缓存,为什么我使用默认缓存策略会得到 200?
  • 那是因为 Alamofire 会自己处理缓存,不会让你看到真正的网络响应。如果你想使用 HTTP-Conditional-Get,从我所看到的你需要将 cachePolicy 设置为 reloadIgnoringCacheData 并自己处理响应的状态码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 2013-09-06
  • 2017-01-13
  • 2015-12-19
相关资源
最近更新 更多