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

Retrofit调用API返回旧数据,无法获取服务端最新更新内容如何解决?

问题原因及排查方案

常见原因

  • OkHttp默认缓存导致:Retrofit底层默认使用OkHttp执行网络请求,OkHttp会自动遵循服务端返回的Cache-Control等缓存响应头,如果服务端配置了缓存有效期,有效期内请求会直接读取本地缓存不会发起新的网络请求,导致拿到旧数据。
  • 请求失败未处理:你当前的onFailure回调为空,如果后续请求触发了网络异常、服务端错误等情况,不会有任何提示,你看到的仍然是首次请求成功后保存在全局变量userlist里的旧数据。
  • 服务端缓存未更新:服务端可能配置了CDN缓存、接口层缓存、数据库查询缓存,修改数据后缓存没有及时失效,导致接口本身返回的就是旧内容,可以先通过Postman、浏览器直接调用接口验证返回内容是否为最新。
  • 自定义配置的缓存逻辑:检查你的Api接口中getVideoData方法是否添加了缓存相关的@Headers注解,或者项目中全局配置了网络缓存拦截器强制缓存请求结果。

修复方案

1. 优先排查请求状态

在onResponse和onFailure中添加日志确认请求状态:

@Override
public void onResponse(Call<List<usermodel>> call, Response<List<usermodel>> response) {
    // 确认是否是网络返回的新数据
    Log.d("REQUEST_STATUS", "是否走缓存:" + (response.raw().cacheResponse() != null));
    Log.d("REQUEST_STATUS", "是否走网络:" + (response.raw().networkResponse() != null));
    Log.d("RESPONSE_DATA", response.body().toString());
    // 原有逻辑
    userlist.clear();
    userlist=response.body();
    Toast.makeText(getApplicationContext(),String.valueOf(userlist.get(1).getFirst_name()+"Size "+ userlist.size()),Toast.LENGTH_LONG).show();
}

@Override
public void onFailure(Call<List<usermodel>> call, Throwable t) {
    Log.e("REQUEST_FAIL", t.getMessage());
    Toast.makeText(getApplicationContext(), "请求失败:" + t.getMessage(), Toast.LENGTH_SHORT).show();
}

2. 禁用OkHttp缓存强制走网络

修改MyRetrofit类中Retrofit的构建逻辑,配置OkHttpClient强制走网络请求:

private MyRetrofit(){
    // 构造不缓存的OkHttpClient
    OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .cache(null) // 直接禁用缓存功能
            .addInterceptor(chain -> {
                Request request = chain.request().newBuilder()
                        .cacheControl(CacheControl.FORCE_NETWORK) // 强制走网络,不读取本地缓存
                        .build();
                return chain.proceed(request);
            })
            .build();

    retrofit=new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(okHttpClient) // 传入自定义配置的OkHttpClient
            .addConverterFactory(GsonConverterFactory.create())
            .build();
}

内容的提问来源于stack exchange,提问作者Emzyn pvt ltd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:06:02