我正在使用OKHttp客户端的Retrofit来缓存来自JSON API的响应。
这很好用。
但是,如果我在设备上执行导致数据在服务器上更新的操作,我需要一种方法来“使某个特定路由无效”,以确保下次请求此数据时,它是再次从服务器获取而不是现在过时的缓存版本。
目前,我通过在请求的Cache-Control标头中显式调用带有“no-cache”标志的新路由来解决这个问题,但这迫使我在需要之前下载新数据,这可能是多次执行多次操作,只是为了使缓存保持最新。
有没有办法可以在我的改装/ OKhttp客户端中标记路由/方法,因为缓存已过期,需要在下次请求时通过网络进行强制更新?
答案 0 :(得分:11)
使用retrofit2和OkHttp3,您可以通过向API方法定义参数添加Cache-Control标头来强制执行新响应:
@GET("ws/something")
Something getSomething(@Header("Cache-Control") String cacheControl);
然后在给您打电话时,为(可能)缓存版本提供null
或为实时版本提供"no-cache"
:
myApi.getSomething(forceRefresh ? "no-cache" : null);
答案 1 :(得分:7)
现在可以使用Cache.urls()
函数在OkHttp中实现。正如the documentation所说:
迭代器支持Iterator.remove()。从中删除URL 迭代器从缓存中驱逐相应的响应。用它来 驱逐选定的回应。
这是merged into master 2014年12月下旬,似乎是这些标签(发布)的一部分: parent-2.4.0-RC1 parent-2.4.0 parent-2.3.0 parent-2.2.0
答案 2 :(得分:4)
没有这方面的API,但应该有一个。请open一个OkHttp问题报告此事。
我们可能需要一段时间才能实施,因为我们需要弄清楚最适合的API是什么。使单个URL无效是很简单的。使一系列URL(例如square.com/cash/*
)无效是比较困难的,因为OkHttp的缓存当前是由URL校验和组织的。还有一些丑陋的边缘情况,例如当前无效的URL被写入缓存时会发生什么。
答案 3 :(得分:1)
使用 urls()
引用 the official code sample:
val urlIterator = cache.urls()
while (urlIterator.hasNext()) {
if (urlIterator.next().startsWith("https://www.google.com/")) {
urlIterator.remove()
}
}