Как Retrofit с OKHttp использовать данные кэша в автономном режиме
Я хочу модернизировать с помощью OkHttp использует кэш, когда нет интернета.
Я готовлю Охттпклиент так:
RestAdapter.Builder builder= new RestAdapter.Builder()
.setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addHeader("Accept", "application/json;versions=1");
if (MyApplicationUtils.isNetworkAvaliable(context)) {
int maxAge = 60; // read from cache for 1 minute
request.addHeader("Cache-Control", "public, max-age=" + maxAge);
} else {
int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
request.addHeader("Cache-Control",
"public, only-if-cached, max-stale=" + maxStale);
}
}
});
и настройка кэша такой:
Cache cache = null;
try {
cache = new Cache(httpCacheDirectory, 10 * 1024 * 1024);
} catch (IOException e) {
Log.e("OKHttp", "Could not create http cache", e);
}
OkHttpClient okHttpClient = new OkHttpClient();
if (cache != null) {
okHttpClient.setCache(cache);
}
и я проверил на корневом устройстве, что в каталоге кэша сохраняются файлы с "заголовками ответов" и файлами Gzip.
но я не получаю правильный ответ от retrofit cache в автономном режиме, хотя в файле GZip закодирован мой правильный ответ. Так как я могу сделать Retrofit может читать Файл gzip и как он может знать, какой файл он должен быть (потому что у меня есть несколько файлов с других ответов) ?
1 ответов
у меня проблема simlar в моей компании :)
проблема была на стороне сервера. В ответ serwer у меня:
Pragma: no-cache
поэтому, когда я убрал это все начинает работать. Прежде чем удалить его, я все время получаю такие исключения:504 Unsatisfiable Request (only-if-cached)
хорошо, так как реализация на моей стороне выглядит.
OkHttpClient okHttpClient = new OkHttpClient();
File httpCacheDirectory = new File(appContext.getCacheDir(), "responses");
Cache cache = new Cache(httpCacheDirectory, maxSizeInBytes);
okHttpClient.setCache(cache);
OkClient okClient = new OkClient(okHttpClient);
RestAdapter.Builder builder = new RestAdapter.Builder();
builder.setEndpoint(endpoint);
builder.setClient(okClient);
если у вас есть проблемы при тестировании, на какой стороне проблема (сервер или приложение). Вы можете использовать такой feauture для установки заголовков, полученных от сервер.
private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());
return originalResponse.newBuilder()
.removeHeader("Pragma")
.header("Cache-Control",
String.format("max-age=%d", 60))
.build();
}
};
и просто добавить это:
okHttpClient.networkInterceptors().add(REWRITE_CACHE_CONTROL_INTERCEPTOR);
благодаря этому, как вы можете видеть, я смог удалить Pragma: no-cache
заголовок для испытания время.
также я предлагаю вам прочитать о :
другие полезные ссылки: