Alamofire 不会自动设置 `If-None-Match` header

Alamofire does not set `If-None-Match` header automatically

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

到应用程序

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

进行 API 调用时,Alamofire 没有设置 If-None-Match header

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

Etag: "7266bc2f1b245365bb1a74da5185bca6"

然而,server B 使用的是弱验证:

ETag: W/"6672-pKPf8kg1eUMH8msoW0et1yskcQQ"

我还尝试在调用 server B 时手动设置 If-None-Match header,服务器响应状态代码 304。我期待 Alamofire 为我的应用程序 return 状态代码 200,相反,它 returns 状态代码 304.

知道为什么 Alamofire 在 API 调用 server B 时不自动设置 If-None-Match 吗?这是一个 Alamofire 错误还是服务器配置问题?我可以做些什么来获得与 API 调用 server A?

相同的行为

提前致谢。

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

The server compares the client's ETag (sent with If-None-Match) with the ETag for its current version of the resource, and if both values match (that is, the resource has not changed), the server sends back a 304 Not Modified status, without a body, which tells the client that the cached version of the response is still good to use (fresh).

Alamofire 在这里不做任何事情,它全部由 URLSession 在幕后处理。

显然,我的问题的原因是因为 server B 有响应 header Cache-Control = no-store 并且 Alamofire 尊重这个 header 并忽略给定的 Etag。