2017-04-13 8 views
1

私はOkHttp3Retrofit2を使用しています。 すべての要求にトークンを代入する必要がありました。 私はTokenAuthentificatorクラス書いた:OkHttpオーセンティケータ

public class TokenAuthenticator implements Authenticator { 

     @Override 
     public Request authenticate(Route route, okhttp3.Response response) throws IOException { 
      return response.request().newBuilder() 
        .header(Const.Url.COOKIE, preferenceHelper.getToken()) 
        .build(); 
     } 
    } 

をし、レトロフィットでそれを初期化:

@Inject 
public RestApi(PreferenceHelper preferenceHelper) { 
    TokenAuthenticator authenticator = new TokenAuthenticator(); 

    this.preferenceHelper = preferenceHelper; 
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 

    OkHttpClient client = new OkHttpClient.Builder() 
      .addInterceptor(interceptor) 
      .authenticator(authenticator) 
      .connectTimeout(10, TimeUnit.SECONDS) 
      .writeTimeout(10, TimeUnit.SECONDS) 
      .readTimeout(30, TimeUnit.SECONDS) 
      .build(); 


    Retrofit retrofit = new Retrofit.Builder().baseUrl(Const.Url.API) 
      .client(client) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .build(); 
    user = retrofit.create(User.class); 
} 

しかし、リクエストのヘッダがまだ置換されていません。 何が問題なのでしょうか?

リクエスト例:アクティビティ/断片で

@Multipart 
    @POST("user_set_photo") 
    Observable<Response<TechmasResponse>> setPhoto(@Part("PERSONAL_PHOTO\"; filename=\"image.png\" ") RequestBody file); 

、次のようになります。 SharedPrererencesで

Subscription request = restApi.user.setPhoto(body) 
       .compose(RxUtils.applySchedulers()) 
       .subscribe(this::successAddPhoto, this::handleError); 
     unSubscribeOnDestroy(request); 

答えて

1

ストアトークンとインターセプタからロード:

public class TokenAppendingHeaderInterceptor implements Interceptor { 

    private TokenStorage tokenStorage; 

    public TokenAppendingHeaderInterceptor(TokenStorage tokenStorage){ 
     this.tokenStorage = tokenStorage; 
    } 

    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request request = chain.request(); 
     String token = tokenStorage.getToken(); 
     Request newRequest = request.newBuilder() 
       .addHeader("Accept", "application/json") 
       .addHeader("sessionId", token) 
       .addHeader("application-type", "REST") 
       .build(); 
     return chain.proceed(newRequest); 
    } 
} 

それは私のために働いた

+0

ありがとうございました!それは働いている –

2

Authenticatorあなたがあなたのトークンを更新する必要があり、そうでなければInterceptorを使用してあなたの要求(聞き手、トークンを追加)を更新する必要があるときに使用されます。

を更新するのにInterceptorを使用しないでください。

TokenAuthenticatorInterceptorを実装する必要があります。

+0

ありがとう!それは働いている –

関連する問題