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 A
和 server 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 项目