我在 Android/Kotlin 中使用 WebView
settings.cacheMode = LOAD_DEFAULT
服务器不返回任何 Cache-Control: 标头!但它会为所有请求返回有效的 ETag 标头。
我想要的是,WebView 发送所有带有 If-None-Match: 标头的请求,设置为仅在确实需要时下载文件。如果标签匹配,则应使用服务器返回的 304 标头。
但是我发现WebView一直在缓存。至少10分钟以上。看起来很随意。而且它似乎根本没有发送 If-None-Match: 标头,因为服务器从不回复 304 标头。
如果我禁用 WebView 的缓存(cacheMode = LOAD_NO_CACHE),它也不会使用 ETag。相反,它总是加载所有内容(如预期)。
如何让WebView使用Etag来处理缓存?简短的请求和使用 ETag 将是完美的。
它适用于网络应用程序,只有在资源确实发生变化时才应该完全重新加载更大的资源。
简短的回答是,Android WebView 无法使用 ETag 标头来正确缓存。它只进行一些内部缓存。
可以通过回调来实现 ETag 和 If-Modified-Since 标头的使用。
我找到了一个网站,展示了这是如何完成的: https://medium.com/android-news/reducing-your-networking-footprint-with-okhttp-etags-and-if-modified-since-b598b8dd81a1
简而言之,您拦截流量并围绕您自己的 ETag 和 If-Modified-Since 标头构建自己的缓存系统。