You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:22:37