If-None-Match не передается в моем запросе

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

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'

compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'

compile 'com.squareup.okhttp3:logging-interceptor:3.0.1'

compile 'com.squareup.okhttp3:okhttp:3.2.0'

логи я вижу против полученного ответа, есть Etag; но последующий запрос, который у меня есть, не имеет If-None-Match, переданного в его заголовке. Я проверил это, вставив If-None-Match явно в свой код, кеширование сработало, и ответ был ожидаемым. Так что наверняка что-то не так с версией библиотек, которые я использую, или что-то не так с моим кодом.

Здесь я настраиваю okClient.

HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);

        okhttp3.OkHttpClient okClient = new okhttp3.OkHttpClient.Builder()
                .addInterceptor(new HeaderInterceptor())
                .addInterceptor(httpLoggingInterceptor)
                .cache(createCacheForOkHTTP())
                .connectTimeout(5, TimeUnit.MINUTES)
                .readTimeout(5, TimeUnit.MINUTES)
                .build();

        retrofit = new Retrofit.Builder()
                .baseUrl(AppConfig.API_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(okClient)
                .build();

Мой перехватчик заголовков содержит логику, которая в значительной степени ориентирована на сам мой API. Вот

private class HeaderInterceptor
            implements Interceptor {


        private String generateAuthHeader(AuthResponse accessToken) {
            if (accessToken == null) {
                return "";
            }
            return String.format("Bearer %s", accessToken.getAccessToken());
        }

        @Override
        public okhttp3.Response intercept(Chain chain)
                throws IOException {
            Request request = chain.request();
            final String authorizationValue = generateAuthHeader(runtime.getPrefAccessToken());
            if (!TextUtils.isEmpty(authorizationValue)) {
                request = request.newBuilder()
                        .addHeader(AppConfig.API_KEY_AUTHORIZATION, authorizationValue)
                        .addHeader(AppConfig.API_KEY_ACCEPT, AppConfig.API_ACCEPT)
                        .build();
                //.addHeader("If-None-Match", "a69385c6d34596e48cdddd3ce475d290")
            } else {
                request = request.newBuilder()
                        .addHeader(AppConfig.API_KEY_CONTENT_TYPE, AppConfig.API_CONTENT_TYPE)
                        .addHeader(AppConfig.API_KEY_ACCEPT, AppConfig.API_ACCEPT)
                        .build();
            }
            okhttp3.Response response = chain.proceed(request);
            return response;
        }

    }

И вот метод, с помощью которого я настраиваю кеш.

 private Cache createCacheForOkHTTP() {
        Cache cache = null;
        cache = new Cache(App.getInstance().getBaseContext().getCacheDir(), 1024 * 1024 * 10);
        return cache;
    }

Ищу быстрый и эффективный ответ, так как я уже потратил разумное время на поиск решения, но не повезло.

Спасибо


person user3242176    schedule 10.03.2016    source источник
comment
Вы смогли решить эту проблему @user3242176? Я столкнулся с той же проблемой.   -  person sherlock    schedule 01.07.2016


Ответы (1)


Ваш код, кажется, работает, я не пробовал, но столкнулся с той же проблемой несколько недель назад. Оказалось, что это из-за того, что лог от модификации не показывал заголовок if-none-match. Но когда я попытался перехватить запрос с помощью прокси-сервера и сначала перенаправить запрос на свой ноутбук (я использовал приложение mitmproxy), появился заголовок if-none-match.

В любом случае, если вы посмотрите на /okhttp3/internal/http/CacheStrategy.java внутри этого метода private CacheStrategy getCandidate(), вы увидите, что OkHttp3 на самом деле правильно использует заголовок etag & if-none-match.

Надеюсь, это прояснит.

person baskara    schedule 06.09.2016