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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 17:37:05