在使用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(); }
新闻热点
疑难解答