如何让OkHttp缓存时同时考虑URL与请求头参数?
解决OkHttp同URL不同请求头缓存冲突问题
核心问题是OkHttp默认缓存键仅包含URL和请求方法,未将影响响应的请求头(如ShopId)纳入,导致同URL不同请求头的请求共用缓存。直接重写Cache类的缓存键生成逻辑即可解决:
1. 自定义HeaderAwareCache类
继承OkHttp的Cache,重写key()方法,将关键请求头拼接到缓存键中:
public class HeaderAwareCache extends Cache { // 可根据需求添加更多需要区分的请求头 private static final String[] RELEVANT_HEADERS = {"ShopId"}; public HeaderAwareCache(File directory, long maxSize) { super(directory, maxSize); } @Override protected String key(Request request) { String baseKey = super.key(request); StringBuilder keyBuilder = new StringBuilder(baseKey); // 遍历需要区分的请求头,拼接到缓存键 for (String headerName : RELEVANT_HEADERS) { String headerValue = request.header(headerName); if (headerValue != null) { keyBuilder.append("_").append(headerName).append("_").append(headerValue); } } return keyBuilder.toString(); } }
2. 配置OkHttpClient使用自定义缓存
创建OkHttpClient实例时,替换默认的Cache为自定义的HeaderAwareCache:
// 缓存目录和大小可根据实际调整 File cacheDir = new File(context.getCacheDir(), "okhttp_header_cache"); long maxCacheSize = 10 * 1024 * 1024; // 10MB OkHttpClient client = new OkHttpClient.Builder() .cache(new HeaderAwareCache(cacheDir, maxCacheSize)) // 其他配置(拦截器、超时等) .build();
原理说明
OkHttp的Cache类通过key()方法生成每个请求的唯一缓存标识,默认仅使用URL和请求方法。重写该方法后,将影响响应结果的请求头(如ShopId)加入缓存键,即可让同URL不同请求头的请求生成独立的缓存条目,避免缓存冲突。
内容的提问来源于stack exchange,提问作者Expiredmind
相关产品推荐
相关产品推荐

