在使用retrofit 请求的时候如果遇到了401怎么办?在每个请求之后都处理?那么这个就比较麻烦。我们可以在获取retrofit之前加入Interceptor,在1.9之前你可以使用RequestInterceptor来拦截一个请求,但在2.0这个被取消,现在我们必须转而使用okHttp的Interceptor。
public WebService getmWebService() {
if (mWebService == null) {
initOkHttpInterceptor();//okhttp的拦截器
retrofit = new Retrofit.Builder()
.baseUrl(UrlConstant.BASE_URL)
.client(client)L
.addConverterFactory(GsonConverterFactory.create())
.build();
mWebService = retrofit.create(WebService.class);
}
return mWebService;
}
private void initOkHttpInterceptor() {
Interceptor mTokenInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request originalRequest = chain.request();
if ( token == null) {//表示第一次登陆还没拉取过token
return chain.proceed(originalRequest);//执行登陆的操作
}
//此处表示已有token 这时只需要判断401即可
Request authorised = originalRequest.newBuilder()
.header("Authorization", token)//此处的token 是你保存在本地的
.build();
Response response = chain.proceed(authorised);//执行此次请求
if (response.code() == 401) {//返回为token失效
refreshToken();//重新获取token,此处的刷新token需要同步执行以防止异步到来的问题
Request newRequest = originalRequest.newBuilder()
.header("Authorization", token)
.build();//
return chain.proceed(newRequest);
}
return response;
}
};
client = new OkHttpClient.Builder()
.retryOnConnectionFailure(true)
.connectTimeout(15, TimeUnit.SECONDS)
.addInterceptor(mTokenInterceptor)
.build();
}