2016-03-10 7 views
9

Widziałem dobrą długą dyskusję na ten temat i twierdzi się, że została naprawiona w wersji 2.3.0. Oto kombinacja UżywamIf-None-Match nie zostanie przekazany na moją prośbę

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' 

logi widzę przed otrzymanej odpowiedzi, mają wytycznych; ale kolejna prośba, którą wykonuję, nie zawiera w nagłówku If-None-Match. Testowałem go, wstawiając If-None-Match jawnie według mojego kodu, buforowanie działało i oczekiwano odpowiedzi. Z pewnością jest coś nie tak z wersją bibliotek, których używam, lub z czymś, co nie jest dobre w moim kodzie.

Tutaj konfiguruję 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(); 

Mój przechwytujący nagłówek zawiera logikę, która jest dość skoncentrowana na samym interfejsie API. Tutaj jest to

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; 
     } 

    } 

A oto metoda, przy pomocy której konfiguruję pamięć podręczną.

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

Szukam jakiegoś szybkiego i skutecznego reagowania jak już wydały rozsądnego czasu znalezienia rozwiązania, ale bez powodzenia.

Dzięki

+1

Czy byłeś w stanie rozwiązać ten problem @ user3242176? Mam do czynienia z tym samym problemem. – sherlock

Odpowiedz

0

Kod wydaje się działać, nie próbowałem go, ale w obliczu tego samego problemu kilka tygodni temu. Okazało się, że to dlatego, że dziennik z retrofitu nie wyświetlał nagłówka if-none-match. Ale kiedy próbowałem przechwycić żądanie za pomocą proxy i przekierować żądanie do mojego laptopa jako pierwszego (korzystałem z aplikacji mitmproxy), pojawił się nagłówek if-none-match.

W każdym razie, jeśli spojrzeć na /okhttp3/internal/http/CacheStrategy.java wewnątrz tej metody private CacheStrategy getCandidate(), widać że OkHttp3 jest rzeczywiście przy ETAG & If-None-mecz nagłówek prawidłowo.

Mam nadzieję, że to wyjaśni.

Powiązane problemy