在使用retrofit 請求的時(shí)候如果遇到了401怎么辦?在每個(gè)請求之后都處理?那么這個(gè)就比較麻煩。我們可以在獲取retrofit之前加入Interceptor,在1.9之前你可以使用RequestInterceptor來攔截一個(gè)請求,但在2.0這個(gè)被取消,現(xiàn)在我們必須轉(zhuǎn)而使用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);//執(zhí)行登陸的操作 } //此處表示已有token 這時(shí)只需要判斷401即可 Request authorised = originalRequest.newBuilder() .header("Authorization", token)//此處的token 是你保存在本地的 .build(); Response response = chain.proceed(authorised);//執(zhí)行此次請求 if (response.code() == 401) {//返回為token失效 refreshToken();//重新獲取token,此處的刷新token需要同步執(zhí)行以防止異步到來的問題 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(); }
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注