Retrofit v2.4.0 未发送 If-Modified-Since header

Retrofit v2.4.0 is not sending the If-Modified-Since header

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

我每天轮询服务器几次,看是否有任何更新的数据,因此需要 If-Modified-Since header。 (推送通知可能会在新版本中实现)

根据这篇文章,设置非常简单:https://futurestud.io/tutorials/retrofit-2-activate-response-caching-etag-last-modified
我已经阅读了几篇相关文章,但这些文章都集中在 use-cases 服务器的实现无法访问或未发送 header 的情况下。这不是我的情况。那些建议使用 networkInterceptors()。由于发送了正确的响应 header,我不需要拦截器(我猜)。

理论上应该可以。

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

代码如下:

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: --> GET http://someserver:8080/model/modelId http/1.1
D/OkHttp: --> END GET

<-- 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: Mon, 14 May 2018 07:22:25 GMT
D/OkHttp: Date: Mon, 14 May 2018 09:03:50 GMT
D/OkHttp: <-- END HTTP

请告诉我我做错了什么。

您服务器的缓存配置不正确。如果您查看 this article's 疑难解答部分,您会发现它需要 Cache-Control: private, must-revalidate