2015-09-22 4 views
4

Я делаю POST-запросы на свой сервер с помощью OkHttp. Это прекрасно работает. Теперь я хочу использовать кеш OkHttp для кэширования ответов на запросы и использовать их, когда устройство находится в автономном режиме. Я пробовал много решений из других вопросов, но никто из них не работает.Кэш-запросы POST с OkHttp

Я использую OkHttp 2.5.0

С кодом ниже, я получаю правильный ответ, когда устройство имеет доступ в Интернет. Но если я выключу интернет, он выбросит java.net. UnknownHostException: Невозможно, чтобы решить множество «example.com»: Нет адрес, связанный с именем хоста

Вот мой текущий код, который не работает:

перехватчик для перезаписи заголовков кэша:

private final Interceptor mCacheControlInterceptor = new Interceptor() { 
    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request request = chain.request(); 

     if (isOnline()) { 
      request.newBuilder() 
        .header("Cache-Control", "public, only-if-cached, max-stale=7887") 
        .build(); 
     } else { 
      request.newBuilder() 
        .header("Cache-Control", "public, max-stale=2419200") 
        .build(); 
     } 

     Response response = chain.proceed(request); 

     // Re-write response CC header to force use of cache 
     return response.newBuilder() 
       .header("Cache-Control", "public, max-age=86400") // 1 day 
       .build(); 
    } 
}; 

метод, чтобы получить клиента:

private OkHttpClient getHttpClient() { 
    if (mHttpClient == null) { 
     mHttpClient = new OkHttpClient(); 
     mHttpClient.setConnectTimeout(CONNECT_TIMEOUT, TimeUnit.MILLISECONDS); 

     File cacheDir = mContext.getDir(CACHE_NAME, Context.MODE_PRIVATE); 
     mHttpClient.setCache(new Cache(cacheDir, CACHE_SIZE)); 

     mHttpClient.networkInterceptors().add(mCacheControlInterceptor); 
    } 

    return mHttpClient; 
} 

Сделать запрос:

RequestBody body = RequestBody.create(TEXT, data); 
Request request = new Request.Builder() 
     .url(url) 
     .post(body) 
     .build(); 
Response response = getHttpClient().newCall(request).execute(); 

ответ

8

Вы не можете кэшировать POST-запросы с кешем OkHttp. Вам нужно будет сохранить их с помощью другого механизма.

+0

... или использовать запросы GET. –

+1

Можете ли вы показать мне какие-либо документы или официальные заметки об этом? – droidev

+2

@JesseWilson прав, здесь у вас есть ссылка на код, который игнорирует любой другой глагол, что это не GET: [okhttp3/Cache.java # L230] (https://github.com/square/okhttp/blob/master /okhttp/src/main/java/okhttp3/Cache.java#L230]) – Juancho

Смежные вопросы