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