retrofit2.HttpException: HTTP 504 неудовлетворительный запрос (только если кешируется) kotlin android - PullRequest
0 голосов
/ 04 ноября 2019

Я хочу кешировать ответ в течение 2 часов и, следовательно, пытался добавить кеш в мой okhttp-клиент, каждый раз при подключении API к сети он работает нормально, но в следующий раз, включив режим полета, мы пытаемся получить данные в автономном режиме, этодает retrofit2.HttpException: HTTP 504 Неудовлетворительный запрос (только если кешируется) Я пробовал каждое решение, связанное с этим исключением, размещенное здесь, на SO. Пожалуйста, помогите мне выяснить, что я делаю не так ... застрял на этом очень долго.

interface TrendingRepoService {

@GET("/repositories?language=&since=daily")
suspend fun getTrendingRepos() : List<Repo>
}

object RetrofitClient {
  private fun getClient(context: Context): Retrofit {
    val cacheSize = (5 * 1024 * 1024).toLong()    //cache size is 5mb
    val myCache = Cache(File(context.cacheDir, "responses"), cacheSize)
    val okHttpClient = OkHttpClient.Builder()
            .cache(myCache)
            .addInterceptor { chain ->
                var request = chain.request()
                if (hasNetwork(context)!!) {
                    request.newBuilder().removeHeader("Pragma")
                            .addHeader("Cache-Control", "public, max-age=" + 5)
                } else {
                    request = request.newBuilder()
                            .removeHeader("Pragma")
                            .addHeader("Cache-Control", "public, only-if-cached, max-stale=" + 60 * 60 * 2)  //cache should expire after 2 hours
                            .build()
                }

                println("network: " + chain.proceed(request).networkResponse())
                println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" + myCache.directory().lastModified())
                println("cache: " + chain.proceed(request).cacheResponse())
                chain.proceed(request)
            }
            .build()

    return Retrofit.Builder()
            .client(okHttpClient)
            .baseUrl("https://github-trending-api.now.sh")
            .addConverterFactory(GsonConverterFactory.create(GsonBuilder().create()))
            .build()
   }
 fun getTrendingService(context: Context): TrendingRepoService {
    return getClient(context).create(TrendingRepoService::class.java)
}
}

Я вижу следующие файлы в папке кэша моего приложения

enter image description here

Содержимое файла сохраняется .0.tmp конечный файл в кеше

https://github-trending-api.now.sh/repositories?language=&since=daily 
GET
0
HTTP/1.1 200 
14
date: Mon, 04 Nov 2019 19:27:43 GMT
content-type: application/json; charset=utf-8
x-powered-by: Express
access-control-allow-origin: *
etag: W/"4fcb-tcvKxcVttStpWpvGjIHTyk/TMbU"
cache-control: max-age=120
x-now-trace: hel1,bru1,sfo1
x-now-id: hel1:rv96m-1572895662521-476640337170
strict-transport-security: max-age=63072000
x-now-instance: 4008292682
content-encoding: gzip
server: now
OkHttp-Sent-Millis: 1572895661313
OkHttp-Received-Millis: 1572895662894

TLS_AES_256_GCM_SHA384
2
MIIFTzCCBDegAwIBAgISA4Bu+MYBP......
0
TLSv1.3

Как максимальный возраст составляет 120 ?? Каждый раз, когда я получаю 504 ошибку, когда я хочу получить данные с кешем. Когда я нажимаю на API без сети, в папке кеша существует только файл журнала, другие два файла не появляются в следующий раз.

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