Как аннулировать / принудительно обновить маршрут кэша по следующему запросу с помощью Retrofit и OKHttp?

Я использую Retrofit с клиентом OKHttp для кэширования ответов из API JSON.

Это работает красиво.

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

В настоящее время я работал вокруг этого явно вызов нового маршрута с флагом "без кэша" в заголовке управления кэшем запроса, но это заставляет меня загружать новые данные до того, как они понадобятся, потенциально несколько раз, если будут предприняты несколько действий, просто чтобы сохранить кэш в актуальном состоянии.

есть ли способ отметить маршрут/метод в моем клиенте retrofit / OKhttp, поскольку срок действия кэша истек, требуя обязательного обновления по сети при следующем запросе?

3 ответов


для этого нет API, но он должен быть. Пожалуйста!--2-->открыть проблема OkHttp, чтобы сообщить об этом.

вероятно, нам потребуется некоторое время для реализации, потому что нам нужно будет выяснить, какой лучший API для этого. Аннулирование одного URL-адреса является простым. Аннулирование диапазона URL-адресов (скажем square.com/cash/*) сложнее, потому что кэш OkHttp в настоящее время организован контрольными суммами URL. Есть также уродливые крайние случаи, например, что происходит, если недействительный URL-адрес в настоящее время записывается в кэш.


С retrofit2 и OkHttp3 вы можете заставить новый ответ, добавив заголовок управления кэшем к параметрам определения метода API:

@GET("ws/something")
Something getSomething(@Header("Cache-Control") String cacheControl);

а затем при вызове вам либо supply null для (возможно-)кэшированной версии или "no-cache" для живой версии:

myApi.getSomething(forceRefresh ? "no-cache" : null);

теперь это возможно в OkHttp с помощью . As документация говорит:

итератор итератор поддерживает.снимать.)( Удаление URL из iterator вытесняет соответствующий ответ из кэша. Используйте это для выселить выбранные ответы.

Это слились в master В конце декабря 2014 года и, кажется, часть этих тегов (выпуски): родитель-2.4.0-rc1 родитель-2.4.0 родитель-родитель 2.3.0-2.2.0