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
相关产品推荐
相关产品推荐

