关于OkHttp中Cache-Control no-cache策略及stale-if-error支持的技术咨询
OkHttp缓存相关问题解答
1. 请求端no-cache处理策略
- OkHttp中
CacheControl.FORCE_NETWORK对应Cache-Control: no-cache,直接发起全量网络请求而非验证缓存,这是有意的设计决策。 - 核心考量:早期设计时为简化缓存逻辑、降低维护复杂度,同时对齐部分传统HTTP客户端的行为,减少开发者迁移时的适配成本。
- 省流量的替代方案:使用
CacheControl.Builder().maxAge(0, TimeUnit.SECONDS).build(),生成Cache-Control: max-age=0请求头。此时OkHttp会自动带上If-None-Match/If-Modified-Since验证缓存,收到服务器304响应时复用缓存体,达到省流量的效果。
2. 无网络时复用缓存的Cache-Control指令
- 关于
stale-if-error(RFC5861):OkHttp官方目前没有明确的支持计划,但接受符合规范的社区PR,只要代码符合OkHttp的设计原则和质量要求。 - 当前实现目标策略的方法:自定义
Interceptor来实现逻辑:
注意:需自行实现网络状态判断逻辑,同时确保缓存响应未被明确禁止缓存。public class StaleIfErrorInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); // 先发起带缓存验证的请求(max-age=0) Request validateRequest = request.newBuilder() .cacheControl(new CacheControl.Builder().maxAge(0, TimeUnit.SECONDS).build()) .build(); try { return chain.proceed(validateRequest); } catch (IOException e) { // 网络不可用时,尝试读取缓存 if (!isNetworkAvailable()) { Request cacheRequest = request.newBuilder() .cacheControl(CacheControl.FORCE_CACHE) .build(); Response cacheResponse = chain.proceed(cacheRequest); if (cacheResponse != null) { return cacheResponse; } } throw e; } } private boolean isNetworkAvailable() { // 自行实现网络状态判断逻辑 return false; } }
内容的提问来源于stack exchange,提问作者mrblrrd
相关产品推荐
相关产品推荐

