在使用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();    }
新聞熱點
疑難解答