2016-03-31 15 views
4

私のRetrofitインターフェイスクリエーターのデザインに問題があります。 APIインターフェイスを一般的な方法でインスタンス化し、トークンが渡されるたびに対応するインスタンスを更新できるようにします。現在、トークンを更新すると、インターフェイスの生成でトークンを使用した新しいインスタンスを取得するために、createService()メソッドを再度呼び出す必要があります。改造インターフェイスのデザインパターン

誰かが同様の質問をしましたが、 here

public class RetrofitCreator { 

    private static String TAG = "RetrofitCreator"; 
    private static String WSSE = null; 
    private static String AmzToken = null; 
    static HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
    private static AmazonAPI amazonAPI = null; 
    private static VanishAPI cobaltAPI = null; 

    //static OkHttpClient client = new OkHttpClient.Builder().build(); 
    static OkHttpClient.Builder httpClient = new OkHttpClient.Builder().addInterceptor(interceptor.setLevel(HttpLoggingInterceptor.Level.BODY)); 

    private static Retrofit.Builder builder = 
      new Retrofit.Builder(); 

    public static <S> S createService(Class<S> serviceClass) { 

     S mAPI = null; 
      if(serviceClass.getSimpleName().equals("VanishAPI")){ 
       if(VanishAPI==null){ 
        VanishAPI = (VanishAPI) createVanishAPI(serviceClass); 
       } 
       mAPI = (S) VanishAPI; 
      }else if(serviceClass.getSimpleName().equals("AmazonAPI")){ 
       if(amazonAPI==null){ 
        amazonAPI = (AmazonAPI) createAmazonAPI(serviceClass); 
       } 
       mAPI = (S) amazonAPI; 
      } 
     return mAPI; 
    } 


    public static void setWSSE(String WSSE) { 
     RetrofitCreator.WSSE = WSSE; 
     vanishAPI = createVanishAPI(VanishAPI.class); 
    } 

    public static void setAmzToken(String token) { 
     RetrofitCreator.AmzToken = token; 
     amazonAPI = createAmazonAPI(AmazonAPI.class); 
    } 

private static <S> S createAmazonAPI(Class<S> serviceClass){ 
    httpClient = getUnsafeOkHttpClient(); 
    builder = new Retrofit.Builder() 
      .baseUrl(Constants.URL_AMAZON) 
      .addConverterFactory(JacksonConverterFactory.create()); 

    if (AmzToken != null) { 
     Log.w(TAG, "WSSE not null!"); 
     Interceptor interceptorSecure = new Interceptor() { 
      @Override 
      public Response intercept(Interceptor.Chain chain) throws IOException { 
       Request original = chain.request(); 

       // Request customization: add request headers 
       Request.Builder requestBuilder = original.newBuilder() 
         .header("Cache-Control", "no-cache") 
         .header("Accept", "application/json") 
         .header("Authorization", "Bearer " + AmzToken) 
         .method(original.method(), original.body()); 

       Request request = requestBuilder.build(); 
       return chain.proceed(request); 
      } 
     }; 
     httpClient.addInterceptor(interceptorSecure); 
    } 

    OkHttpClient client = httpClient.build(); 
    Retrofit retrofit = builder.client(client).build(); 
    return retrofit.create(serviceClass); 
} 

(...) 
} 

私が使用して各アクティビティにそれを得るために:このようなあなたのインターセプタを見てください

amazonApi = RetrofitCreator.createService(AmazonAPI.class); 

答えて

1

public class TokenInterceptor implements Interceptor { 

    private String token; 

    public String getToken() { 
     return token; 
    } 

    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request original = chain.request(); 

      // Request customization: add request headers 
      Request.Builder requestBuilder = original.newBuilder() 
        .header("Cache-Control", "no-cache") 
        .header("Accept", "application/json") 
        .method(original.method(), original.body()); 
      if (getToken() != null) { 
       requestBuilder.header("Authorization", "Bearer " + AmzToken); 
      } 
      Request request = requestBuilder.build(); 
      return chain.proceed(request); 
    } 

    public void setToken(String token) { 
     this.token = token; 
    } 
} 

これをあなたに追加してください。クライアントとこのインターセプタを参照してください。 トークンを変更するたびにcreateService()に電話する必要はありません。インターセプタでトークンを変更するにはinterceptor.setToken()

+0

クラスを内部静的クラスとして作成することはできますか?https://github.com/kaaes/spotify-web-api-android/blob/master/spotify-api/ src/main/java/kaaes/spotify/webapi/android/SpotifyApi.java –

+0

は確実です。あなたは外部クラスにトークンを設定する必要があります –

関連する問題