2017-03-29 3 views
0

私のコードが間違っていることを教えてください。インターセプタにヘッダー "Authorization"を追加できませんでした。私がリクエストをすると、エラーがスローされますretrofit2.adapter.rxjava.HttpException:HTTP 401 Unauthorized。しかし、各リクエストにヘッダートークンを追加すると、インターセプタリクエスタにヘッダーを追加できない理由改造時にOkHttp?

@Header("Authorization") String token 

が動作します。

は、ここに私のコードです:

protected Retrofit retrofit; 
protected OkHttpClient client; 
protected T api; 
protected UserCredential userCredential; 

public RestClient(Class<T> type) { 
    if (client == null) { 
     synchronized (OkHttpClient.class) { 
      client = new OkHttpClient(); 
      client.newBuilder().addInterceptor(chain -> { 
       Request original = chain.request(); 
       Request.Builder builder = original.newBuilder(); 
       if (GrabDoiApplication.getInstance().getCurrentCredentials() != null) { 
        String token = GrabDoiApplication.getInstance().getCurrentCredentials().getToken(); 
        if (token != null) { 
         builder.addHeader("Authorization", token); 
        } 
       } 
       builder.method(original.method(), original.body()); 

       return chain.proceed(builder.build()); 
      }).build(); 

      if (retrofit == null) { 
       synchronized (Retrofit.class) { 
        Retrofit.Builder retrofitBuilder = new Retrofit.Builder() 
          .baseUrl(Constants.GRABDOI_SERVER_URL) 
          .client(client) 
          .addConverterFactory(GsonConverterFactory.create()) 
          .addCallAdapterFactory(RxJavaCallAdapterFactory.create()); 
        retrofit = retrofitBuilder.build(); 
       } 
      } 
     } 
    } 
    api = retrofit.create(type); 
} 

答えて

1

あなたはインターセプタの体の外に静的メソッドへのアクセスを置くことを試みることができます。

public RestClient(Class<T> type) { 
    if (retrofit != null) { 
     return; 
    } 
    synchronized (OkHttpClient.class) { 
     client = new OkHttpClient(); 
     OkHttpClient.Builder builder = client.newBuilder(); 
     final String token; 
     if (GrabDoiApplication.getInstance().getCurrentCredentials() != null && 
       (token = GrabDoiApplication.getInstance().getCurrentCredentials().getToken()) != null) { 
      builder.addInterceptor(chain -> { 
       Request.Builder builder = chain.request().newBuilder(); 
       builder.addHeader("Authorization", token); 
       builder.method(original.method(), original.body()); 
       return chain.proceed(builder.build()); 
      }); 
     } 
     client = builder.build(); 

     synchronized (Retrofit.class) { 
      Retrofit.Builder retrofitBuilder = new Retrofit.Builder() 
        .baseUrl(Constants.GRABDOI_SERVER_URL) 
        .client(client) 
        .addConverterFactory(GsonConverterFactory.create()) 
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create()); 
      retrofit = retrofitBuilder.build(); 
     } 
    } 


    api = retrofit.create(type); 
} 
+0

あなたが正しいです。本当にありがとう。 –

関連する問題