检测OkHttp响应是否来自caching(使用Retrofit)

有没有一种方法来检测,如果一个Retrofit响应来自configuration的OkHttpcaching或是一个实时响应?

客户定义:

Cache cache = new Cache(getCacheDirectory(context), 1024 * 1024 * 10); OkHttpClient okHttpClient = new OkHttpClient.Builder() .cache(cache) .build(); 

Api定义:

 @GET("/object") Observable<Result<SomeObject>> getSomeObject(); 

示例调用:

 RetroApi retroApi = new Retrofit.Builder() .client(okHttpClient) .baseUrl(baseUrl) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build() .create(RetroApi.class); result = retroApi.getSomeObject().subscribe((Result<SomeObject> someObjectResult) -> { isFromCache(someObjectResult); // ??? }); 

Solutions Collecting From Web of "检测OkHttp响应是否来自caching(使用Retrofit)"

解决scheme1:

通过使用okhttp3.Response.cacheResponse(),您可以检查是否从caching中收到响应:

返回从caching中收到的原始响应。 如果此响应未使用caching,则将为空

为了从你的改造得到原始OkHttp响应响应使用.raw() 。 即:

 public boolean isFromCache(Result<?> retroResult) { return retroResult.response().raw().cacheResponse() != null; } 

解决scheme2:

您可以通过new OkHttpClient.Builder().addInterceptor(...)将拦截器添加到OkHttp客户端。 在这个Interceptor中通过chain.proceed(chain.request)获取响应。 然后分别使用Response.cacheResponse()Response.networkResponse()来确定响应来自哪里。

完整代码:

 new OkHttpClient.Builder().addInterceptor(chain -> { Response response = chain.proceed(chain.request()); if (response.cacheControl() != null) { // from cache } else if (response.networkResponse() != null) { // from network } return response; }); 

任何时候你有一个okhttp3.Responseokhttp3.Responseretrofit2.Response.raw() ),你可以检查响应是否来自caching。

引用杰西·威尔逊的话:

有几个组合。

只有.networkResponse() – 您的请求是从networking专门服务的。

仅限.cacheResponse() – 您的请求是专门从caching中提供的。

.networkResponse()和.cacheResponse() – 您的请求是一个有条件的GET,所以标题来自networking,正文来自caching。

 if (response.raw().cacheResponse() != null) { // true: response was served from cache } if (response.raw().networkResponse() != null) { // true: response was served from network/server } 

但是我build议你检查你的networkResponse是否为null,因为一旦请求被caching了,并且你也有一个networkResponse,你的响应stream经networking而不是caching(取决于你在CacheControl中指定的maxStale) 。 因此,检查networkResponse是否为空,如果为null,并且您的cacheResponse不为null,则响应由caching提供,反之亦然。