2016-03-10 11 views
9

Ich habe gute lange Diskussion zu diesem Thema gesehen und es wird behauptet, dass in 2.3.0 behoben werden. Hier ist die Kombination verwende ichIf-None-Match wird in meiner Anfrage nicht übergeben

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' 

Protokolle I gegen empfangene Antwort zu sehen, haben Etag; aber nachfolgende Anfrage habe ich nicht If-None-Match in seiner Kopfzeile übergeben. Ich habe es getestet, indem ich If-None-Match explizit durch meinen Code eingefügt habe, Caching funktioniert und Antwort wurde erwartet. Es ist also sicher etwas falsch mit der Version von Bibliotheken, die ich verwende oder etwas, das nicht gut mit meinem Code ist.

Hier richte ich den okClient ein.

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(); 

Mein Kopf Interceptor enthält die Logik, die so ziemlich auf meine API selbst konzentriert. Hier ist es

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

    } 

Und hier ist die Methode, mit der ich Cache einrichten.

Auf der Suche nach einer schnellen und effektiven Antwort, da ich bereits eine vernünftige Zeit damit verbracht habe, die Lösung zu finden, aber kein Glück.

Dank

+1

konnten Sie dieses Problem @ user3242176 beheben? Ich stehe vor dem gleichen Problem. – sherlock

Antwort

0

Ihr Code zu funktionieren scheint, habe ich es nicht ausprobiert, aber stand ich das gleiche Problem vor ein paar Wochen. Es stellte sich heraus, dass es wegen des Logs von Retrofit nicht den if-none-match-Header zeigte. Aber als ich versuchte, die Anfrage mit Proxy abzufangen und die Anfrage zuerst an meinen Laptop umzuleiten (ich benutzte die App mitmproxy), erschien der Header if-none-match.

Wie auch immer, wenn Sie in dieser Methode suchen in /okhttp3/internal/http/CacheStrategy.javaprivate CacheStrategy getCandidate(), werden Sie sehen, dass OkHttp3 tatsächlich den ETAG verwendet & if-None-Match-Header richtig.

Hoffe das klärt auf.