Retrofit v2.4.0未发送If-Modified-Since标头

时间:2018-05-14 10:24:02

标签: android retrofit retrofit2 okhttp3

这可能是一个非常基本的问题,但我已经没有想法了。
Retrofit v2.4.0没有发送 If-Modified-Since 标头,因此缓存无法正常工作。

我每天多次轮询服务器以查看是否有更新的数据,因此需要 If-Modified-Since 标头。 (推送通知可以在新版本中实施)

根据这篇文章,设置非常简单:https://futurestud.io/tutorials/retrofit-2-activate-response-caching-etag-last-modified
我已经阅读了几篇相关文章,但是当服务器的实现无法访问或者没有发送标题时,这些文章主要关注用例。这不是我的情况。那些建议使用networkInterceptors()。由于发送了正确的响应头,我不需要拦截器(我猜)。

理论上它应该有用。

根据响应标头,看起来服务器配置正确。

以下是代码:

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.HEADERS);

Cache cache = new Cache(getApplication().getCacheDir(), 30 * 1024 * 1024);

httpClient = new OkHttpClient.Builder()
    .cache(cache)
    .addInterceptor(logging)
    .build();

retrofit = new Retrofit.Builder()
    .baseUrl("http://someserver:8080/")
    .callbackExecutor(Executors.newSingleThreadExecutor())
    .client(httpClient)
    .addConverterFactory(GsonConverterFactory.create())
    .build();

日志:

  

D / OkHttp: - >获取http://someserver:8080/model/modelId http / 1.1
  D / OkHttp: - >结束了

     

< - 200 OK http://someserver:8080/model/modelId(23ms)
  D / OkHttp:Cache-Control:private
D / OkHttp:Content-Length:   3240854
D / OkHttp:Content-Type:application / octet-stream
  D / OkHttp:Last-Modified:2018年5月14日星期一07:22:25 GMT
  D / OkHttp:日期:星期一,2018年5月14日09:03:50 GMT
D / OkHttp:< - END   HTTP

请让我知道我做错了什么。

1 个答案:

答案 0 :(得分:2)

您的服务器缓存配置不正确。如果您查看this article's疑难解答部分,您会注意到它必须是Cache-Control: private, must-revalidate