Retrofit Token過期 重新請求Token再去請求介面
阿新 • • 發佈:2019-01-27
需求是這樣的:請求介面A -- 伺服器返回資料Token過期或失效 -- 重新請求Token並設定 -- 再去請求介面A
剛解決了這個問題,趁熱打鐵,寫個部落格記錄一下;這個Token是新增到請求頭裡面的;
使用OKHTTP設定Retrofit中的請求頭:
*記錄請求到的Token
/** * 請求頭token * @return */ public String headerToken = "";*如果Token過期或失效,則去重新請求獲取token的介面,然後設定請求頭,再去重新請求這個介面。
OkHttpClient.Builder client = new OkHttpClient.Builder();client.connectTimeout(30, TimeUnit.SECONDS); client.readTimeout(30, TimeUnit.SECONDS); client.writeTimeout(30, TimeUnit.SECONDS); client.addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request.Builder request = chain.request().newBuilder();request.addHeader("Authorization", headerToken); //新增預設的Token請求頭 Response proceed = chain.proceed(request.build()); //如果token過期 再去重新請求token 然後設定token的請求頭 重新發起請求 使用者無感 if (isTokenExpired(proceed)){ String newHeaderToken = getNewToken(); //使用新的Token,建立新的請求 Request newRequest = chain.request().newBuilder() .addHeader("Authorization", newHeaderToken) .build(); return chain.proceed(newRequest); } return proceed; } });
*判斷Token過期的方法
/** * 根據Response,判斷Token是否失效 * 401表示token過期 * @param response * @return */ private boolean isTokenExpired(Response response) { if (response.code() == 401) { return true; } return false; }
*重新請求Token的方法,注意這個方法不能使用非同步,要使用同步請求;
/** * 同步請求方式,獲取最新的Token * * @return */ private String getNewToken() throws IOException { Retrofit retrofit= new Retrofit.Builder() .baseUrl("https://xxxxx") .addConverterFactory(GsonConverterFactory.create()) .build(); retrofit2.Response<JsonObject> tokenJson = retrofit.create(CommonApi.class).ccbTestGetToken().execute(); headerToken = tokenJson.body().get("Token").toString(); return headerToken; }參考部落格 一葉扁舟:https://blog.csdn.net/jdsjlzx/article/details/52442113