检查缓存的HTTP响应的有效性。

4
使用URLSession类族,有没有一种方法来检查响应的有效性?具体来说,我有一个HTTP响应,其中Cache-Control头指定为no-cache,这样任何缓存的响应都必须提交进行验证,然后才能使用。我可以从URLCache.shared中检索CachedURLResponse对象,但是URLSessionURLCacheCachedURLResponse似乎没有任何方法来确定这样的缓存响应是否仍然有效。这样的方法也不存在于URLSessionDelegateURLSessionTaskDelegate中。

除了自己启动实际的验证请求之外,还有其他方法吗?可能在URLSession堆栈中的某个地方执行此操作(尽管我不确定),但看起来公共API可能没有公开此功能。

2个回答

2
问题是为什么需要检查有效性。如果你只想检查有效性,你可以使用一个可能不常见的方法,使用URLProtocol并编写自定义NSURLProtocolClient。客户端只有空方法,除了:
func urlProtocol(_ protocol: URLProtocol, cachedResponseIsValid cachedResponse: CachedURLResponse) {
    // Cached response is valid. Store this information in a appropriate way.
    protocol.stopLoading()
}

现在,您需要与该客户端创建一个协议。
let myClient = ...
let protocol = NSURLProtocol(request, cachedResponse, client: myClient)

protocol.startLoading()
protocol.stopLoading() // Stop, if urlProtocol(_: cachedResponseIsValid:) was not called

这样做行不通——缓存响应将会被愉快地存储在temporaryCache中并被检索。我们不知道缓存的响应是否有效,直到我们再次请求页面并可能收到“未修改”的响应。 - Jumhyn

1
据我所知,HTTP响应的缓存是自动处理的。(为了确保,在回答这个问题之前,我再次进行了尝试)。 URLRequest上的默认缓存策略是useProtocolCachePolicy。因此,在对该URL进行所有后续请求时,HTTP头将包含If-None-Match键,并将最新的Etag作为其值。
如果这对你不起作用,请确保服务器在其响应中发送Etag头。并且服务器在所有请求上都承认If-None-Match头。 简而言之:
  1. 确保从服务器响应中获取到 Cache-ControlEtag 头信息。

  2. 在所有后续请求中,确保服务器接收到一个带有正确的 Etag 值的 If-None-Match 头信息。

  3. 确保服务器实际上已配置处理缓存响应(即正确响应 If-None-Match 头信息)。

参考资料:

https://developer.apple.com/documentation/foundation/nsurlrequest.cachepolicy https://devcenter.heroku.com/articles/ios-network-caching-http-headers


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接