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
。
这可能是一个非常基本的问题,但我 运行 没有想法。
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
。