2017-04-13 104 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); 
    } 
} 

这工作对我来说,当你要求退货401,你需要更新你的令牌

+0

谢谢!它的工作 –

2

Authenticator使用,以更新您的请求(hearders,添加标记),否则使用Interceptor

请勿使用Interceptor来更新您的令牌

所以你的TokenAuthenticator必须实现Interceptor

+0

谢谢!它正在工作 –