retrofit2拦截器处理401

来源:互联网 发布:centos 7 1708怎么样 编辑:程序博客网 时间:2024/06/11 10:11

在使用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();    }


0 0
原创粉丝点击