Используйте только кэшированный ответ.Без сетевого вызова - PullRequest
0 голосов
/ 23 октября 2018

Существует API с ограничением вызовов, в этом случае я хочу кэшировать ответ и не запускать сетевой ответ, если кэш все еще действителен.

Прежде всего, у меня есть cache interceptor

fun provideCacheInterceptor(): Interceptor = Interceptor { chain ->
        val response = chain.proceed(chain.request())
        val cacheControl = CacheControl.Builder()
                .maxAge(6, TimeUnit.HOURS)
                .maxStale(6, TimeUnit.HOURS)
                .onlyIfCached()
                .build()
        response.newBuilder()
                .header("CacheControl", cacheControl.toString())
                .build()
    }

Я прикрепляю кеш и перехватчик к клиенту

client = OkHttpClient().newBuilder()
                .cache(cache)
                .addInterceptor(loggingInterceptor)
                .addInterceptor(cacheInterceptor)

В результате, когда я пытаюсь проверить ответ от кеша и / или из сети

Log.e("!@#", "cached: ${it.raw().cacheResponse()?.toString()}")
Log.e("!@#", "network: ${it.raw().networkResponse()?.toString()}")

Я получаю

cached: Response{protocol=http/1.1, code=200, message=, url=https://API}
network: Response{protocol=h2, code=200, message=, url=https://API}

Есть ли способ не для вызова конечной точки сети, если кэш все еще действителен?

1 Ответ

0 голосов
/ 23 октября 2018

Проблема в моей реализации, что я выполняю исходный запрос и применяю заголовок к ответу (мой плохой), необходимо изменить первоначальный запрос и затем продолжить измененный запрос.Также выглядит как Cache-Control опечатка заголовка.

Надлежащий перехватчик кэша выглядит как

fun provideCacheInterceptor(networkManager: NetworkManager): Interceptor = Interceptor { chain ->
        val request = chain.request()
        val cacheControl = CacheControl.Builder()
                .maxAge(6, TimeUnit.HOURS)
                .maxStale(6, TimeUnit.HOURS)
                .build()
        chain.proceed(request.newBuilder()
                .header("Cache-Control", cacheControl.toString())
                .build())
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...