需求是这样的:请求接口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