Android中OkHttpCache使用urls().remove()移除特定响应历史无效
移除OkHttp中特定API的缓存条目
问题根源
你之前用client.cache?.urls()?.remove()无效的原因是:urls()返回的是缓存中所有URL的不可变快照集合,修改这个集合只会改变内存中的临时数据,完全不会影响磁盘上的实际缓存文件。而且这个方法也无法精准匹配特定请求的缓存(因为缓存key是基于完整Request生成的,不止是URL)。
正确解决方案
OkHttp的Cache类提供了remove(Request)方法,这才是精准移除特定请求缓存的正确方式。你需要构建一个和原请求完全匹配的Request实例,然后调用该方法删除对应缓存。
代码示例
假设你要移除的是GET https://google.com/v1/123的缓存:
// 从你的OkHttpClient实例中获取Cache val cache = okHttpClient.cache ?: return // 构建与原请求完全一致的Request(关键:匹配缓存key) val targetRequest = Request.Builder() .url("https://google.com/v1/123") .get() // 必须和原请求的HTTP方法一致 // 如果原请求有自定义Cache-Control等缓存相关Header,需要一并添加 // .header("Cache-Control", "public, max-age=3600") .build() // 执行缓存移除操作 cache.remove(targetRequest)
注意事项
- 请求匹配规则:OkHttp的缓存key由请求的方法、URL、请求头(部分缓存相关字段)、POST请求的请求体哈希共同决定。所以构建
targetRequest时,必须保证这些属性和原请求完全一致,否则无法找到对应缓存条目。 - POST请求处理:如果是POST请求,需要在构建
targetRequest时添加和原请求相同的请求体,比如:val requestBody = FormBody.Builder() .add("param", "value") .build() val targetRequest = Request.Builder() .url("https://google.com/v1/123") .post(requestBody) .build()
内容的提问来源于stack exchange,提问作者Ishika Singh
相关产品推荐
相关产品推荐

