Как получить данные из сети, а не из кеша http? - PullRequest
0 голосов
/ 25 сентября 2018

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

@Singleton
@Provides
fun httpClient(context: Context, @Named(“UserPreferences”) preferences: SharedPreferences): OkHttpClient {
val appCacheDir = context.cacheDir
val httpCacheDir = File(appCacheDir, HTTP_CACHE_DIRNAME)
if (!httpCacheDir.exists()) {
  httpCacheDir.mkdirs()
}
val builder = OkHttpClient.Builder()
val authInterceptor = LegacyAuthInterceptor(preferences, userAuthRelay)
builder.addNetworkInterceptor(authInterceptor)

if (BuildConfig.DEBUG) {
  builder.addNetworkInterceptor(StethoInterceptor())
}

builder.addNetworkInterceptor(CacheHeaderInterceptor(isStoreUpdatedRelay))

return builder
    .cache(Cache(httpCacheDir, MAX_HTTP_CACHE_SIZE))
    .connectTimeout(30, SECONDS)
    .writeTimeout(30, SECONDS)
    .readTimeout(30, SECONDS)
    .retryOnConnectionFailure(true)
    .build()
  }

  class CacheHeaderInterceptor(private val isUpdatedRelay: BehaviorRelay<Boolean>) : Interceptor {



override fun intercept(chain: Interceptor.Chain): Response {

chain.request().headers().get(CustomCacheHeader.CUSTOM_CACHE_HEADER_KEY)
    ?: return chain.proceed(chain.request()) 



val maxAge = chain.request().headers().values(CustomCacheHeader.CUSTOM_CACHE_HEADER_KEY).firstOrNull()?.toLongOrNull()

val modifiedRequest = chain.request().newBuilder().removeHeader(CustomCacheHeader.CUSTOM_CACHE_HEADER_KEY).build()

val originalResponse = chain.proceed(modifiedRequest)
return when {
  isUpdatedRelay.value -> {
    val modifiedResponse = originalResponse.newBuilder()
        .addHeader("Cache-Control", "no-cache")
        .build()
    isStoreUpdatedRelay.accept(false)
    modifiedResponse
  }
  maxAge != null -> {
    // Add Cache-Control to the response.
    val modifiedResponse = originalResponse.newBuilder()
        .removeHeader("Cache-Control")
        .removeHeader("Pragma")
        .addHeader("Cache-Control", "max-age=$maxAge")
        .build()
    modifiedResponse
  }
  else -> // Missing max-age, proceed with original response.
    originalResponse
}

}}

1 Ответ

0 голосов
/ 30 ноября 2018

Я нашел решение для моего вопроса, добавив addInterceptor (). Есть addNetworkInterceptor () и addInterceptor ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...