2016-03-10 14 views
9

このトピックに関する長い議論があり、2.3.0で修正されていると主張しています。ここで は、のEtagを持って、私は私が受け取った応答に対して参照私の要求で一致しない場合は、

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' 

ログを使用しています組み合わせたものです。その後のリクエストでは、ヘッダーに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; 
    } 

解決策を見つけるのに妥当な時間を費やしたが、運がないので、すばやく効果的な対応を探しています。

おかげ

+1

この問題は@ user3242176で解決できましたか? 私は同じ問題に直面しています。 – sherlock

答えて

0

はあなたのコードが動作しているようだ、私はそれを試していないが、私は数週間前に同じ問題に直面していました。それは改造からのログのために、一致しない場合のヘッダーを表示しなかったことが判明しました。しかし、私はプロキシを使用して要求を傍受し、私のラップトップに最初に(私はmitmproxyアプリを使用していた)要求をリダイレクトしようとすると、一致しない場合のヘッダーが表示されました。あなたはこの方法private CacheStrategy getCandidate()/okhttp3/internal/http/CacheStrategy.javaに見れば

とにかく、あなたはOkHttp3が実際のETag & If-None-Matchヘッダを適切に使用していることがわかります。

これは明らかです。

関連する問題