2016-03-10 29 views
9

Ho visto una lunga discussione su questo argomento e si afferma che sia stato risolto in 2.3.0. Qui è la combinazione che sto usandoIf-None-Match non viene superato nella mia richiesta

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' 

ceppi vedo contro risposta ricevuta, ha Etag; ma la richiesta successiva che faccio non ha If-None-Match passato nella sua intestazione. L'ho provato inserendo in modo esplicito If-None-Match dal mio codice, il caching funzionava e la risposta era prevista. Quindi c'è sicuramente qualcosa di sbagliato nella versione delle librerie che sto usando o qualcosa che non va bene per il mio codice.

Qui sto impostando 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(); 

Il mio header intercettore contiene la logica che è praticamente focalizzata sulla mia API stessa. Qui è

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

    } 

Ed ecco il metodo con cui sto impostando la cache.

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

Alla ricerca di qualche risposta rapida ed efficace, come ho già speso tempo ragionevole trovare la soluzione, ma senza fortuna.

Grazie

+1

sei riuscito a risolvere questo problema @ user3242176? Sto affrontando lo stesso problema. – sherlock

risposta

0

Il tuo codice sembra funzionare, non ho provato fuori ma ho affrontato lo stesso problema qualche settimana fa. Si è scoperto che era a causa del log proveniente dal retrofit che non mostrava l'intestazione if-none-match. Ma quando ho provato ad intercettare la richiesta usando il proxy e reindirizzare la richiesta al mio portatile prima (stavo usando l'app mitmproxy), è apparso l'intestazione se-none-match.

In ogni caso, se si guarda in /okhttp3/internal/http/CacheStrategy.java all'interno di questo metodo private CacheStrategy getCandidate(), vedrete che OkHttp3 è in realtà utilizzando l'ETAG & se-None-Match intestazione correttamente.

Spero che questo chiarisca.