是否有關於如何添加緩存和ETAG
/If-None-Match
支持Retrofit + OkHttp的正確解釋? 我很努力在2個項目上添加Etag
支持,起初我懷疑HTTP頭可能存在問題,另一個項目正確設置了所有內容,並且緩存仍然無法正常工作。改造ETAG和緩存
以下是我嘗試使其工作。結果表明,緩存似乎在應用程序的同一個實例中工作,但只要我重新啓動 - 所有內容都會再次加載。 另外,在我的日誌中,我沒有看到If-None-Match
被添加到請求中,所以我假定服務器不知道ETag
,並且仍然完全重新計算響應。
這裏有一些代碼示例:
public class RetrofitHttpClient extends UrlConnectionClient
{
private OkUrlFactory generateDefaultOkUrlFactory()
{
OkHttpClient client = new com.squareup.okhttp.OkHttpClient();
try
{
Cache responseCache = new Cache(baseContext.getCacheDir(), SIZE_OF_CACHE);
client.setCache(responseCache);
}
catch (Exception e)
{
Logger.log(this, e, "Unable to set http cache");
}
client.setConnectTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS);
client.setReadTimeout(CONNECT_TIMEOUT, TimeUnit.MILLISECONDS);
return new OkUrlFactory(client);
}
private final OkUrlFactory factory;
public RetrofitHttpClient()
{
factory = generateDefaultOkUrlFactory();
}
@Override
protected HttpURLConnection openConnection(retrofit.client.Request request) throws IOException
{
return factory.open(new URL(request.getUrl()));
}
}
休息適配器,然後用FULL日誌級別和自定義標記製作:
restAdapter = new RestAdapter.Builder()
.setClient(new RetrofitHttpClient())
.setEndpoint(Config.BASE_URL)
.setRequestInterceptor(new SignatureSetter())
.setConverter(new JacksonConverter(JsonHelper.getObjectMapper()))
.setLogLevel(RestAdapter.LogLevel.FULL)
.setLog(new AndroidLog("=NETWORK="))
.build();
我有程序的第一個屏幕上的長期要求供測試用。 當我打開應用程序 - 完成請求需要7秒。如果我暫停並恢復應用程序 - 相同的請求需要250毫秒,顯然會觸及緩存。如果我完全關閉應用程序並重新啓動 - 它再次需要7秒鐘。
UPDATE: 至於建議,我已經使用了自定義的改造建設,並附LoggingInterceptor。這是我得到的。
Received response for *** in 449,3ms
Date: Wed, 07 Jan 2015 09:02:23 GMT
Server: Apache
X-Powered-By: PHP/5.4.31
Access-Control-Allow-Credentials: true
Pragma:
Cache-Control: public, max-age=3600
X-Frame-Options: SAMEORIGIN
Etag: "hLxLRYztkinJAB453nRV7ncBSuU=-gzip"
Last-Modified: Wed, 24 Dec 2014 13:09:04 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
OkHttp-Selected-Protocol: http/1.1
OkHttp-Sent-Millis: 1420621288104
OkHttp-Received-Millis: 1420621288554
Sending request **** on Connection{****:80, [email protected] hostAddress=**** cipherSuite=none protocol=http/1.1}
Accept: application/json;
Host: ****
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/2.2.0
Response is equal to described above
如您所見,在下一個請求中不存在If-None-Match
標頭。
服務器響應是否正確實施了「Cache-Control」? – 2014-12-28 00:42:42
是的。正如我所提到的,我有2個項目。在1個項目服務器上有Cache-Control:max-age = 0,private,must-revalidate。我知道這看起來不正確。但另一臺服務器具有正確的緩存控制設置,可以在一段時間內進行緩存。 – AAverin 2014-12-28 09:00:24
您是否正在充分消費響應主體?如果你沒有閱讀整個響應主體,它不會被緩存。 (你還需要在最後調用'close()')。 – 2015-01-08 21:55:28