Alamofire 不会自动设置“If-None-Match”标头

Posted

技术标签:

【中文标题】Alamofire 不会自动设置“If-None-Match”标头【英文标题】:Alamofire does not set `If-None-Match` header automatically 【发布时间】:2021-05-25 03:30:07 【问题描述】:

我有一个 ios 应用程序,它使用 Alamofire 5.2.2 对 2 个不同的服务器(server Aserver B)进行 API 调用。根据我的理解和我在 *** 上阅读的内容,只要缓存策略设置为 .useProtocolCachePolicy,Alamofire 应该会自动设置 If-None-Match 请求标头,如果服务器以状态响应,则向应用程序返回状态代码 200代码304

我能够对server A 进行API 调用,并且Alamofire 正在按预期设置If-None-Match 标头。但是,通过使用同一组代码,当我对 server B 进行 API 调用时,Alamofire 不会设置 If-None-Match 标头。

我注意到的一件事是server A 正在使用强验证:

Etag: "7266bc2f1b245365bb1a74da5185bca6"

server B 使用的是弱验证:

ETag: W/"6672-pKPf8kg1eUMH8msoW0et1yskcQQ"

我还尝试在调用server B 时手动设置If-None-Match 标头,服务器以状态码304 响应。我期待 Alamofire 将状态代码 200 返回到我的应用程序,而不是返回状态代码 304

知道为什么 Alamofire 在 API 调用 server B 时不会自动设置 If-None-Match 吗?这是 Alamofire 错误还是只是服务器配置问题?我能做些什么来获得与对server A 进行 API 调用相同的行为?

提前致谢。

【问题讨论】:

【参考方案1】:

304 响应似乎是意料之中的,因为大多数服务器使用它来指示缓存的数据仍然很好。来自Microsoft's MDN documentation:

服务器将客户端的 ETag(使用 If-None-Match 发送)与其当前版本资源的 ETag 进行比较,如果两个值都匹配(即资源未更改),则服务器发回一个304 Not Modified 状态,没有正文,告诉客户端响应的缓存版本仍然可以使用(新鲜)。

Alamofire 在这里不做任何事情,这一切都由 URLSession 在后台处理。

【讨论】:

感谢您的回复,但这仍然不能解释为什么服务器 A 和服务器 B 给出不同的结果。您认为这与服务器端配置有关吗? 可能。如果它返回不同的标签,它可能在其他方面也不同。【参考方案2】:

显然,我的问题的原因是因为server B 具有响应标头Cache-Control = no-store 而Alamofire 尊重此标头并忽略给定的Etag。

【讨论】:

以上是关于Alamofire 不会自动设置“If-None-Match”标头的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 不会使用 Cocoapods 构建空的 Swift 项目

带有附加功能的 Alamofire 不会显示数据

Alamofire POST 方法不会将值传递给 url

Swift AlamoFire 5 不会执行请求

Alamofire publishDecodable 不会向服务器发送请求,但 responseDecodable 会

Alamofire/RxSwift 如何在状态码 401 上自动刷新令牌和重试请求