1.笨办法:每次请求都检查一下时间最后一次登录成功的时间,如果过期重新登录;
2.RxJava:retryWhen,请求失败了尝试登陆了在请求;(但是每个请求的方法里面都要写一遍retryWhen麻烦。如果用了rxjava,可以考虑这种方法。(具体代码待补充)
3.使用okhttp3的拦截器(最佳)Interceptor。
具体实践:
由于我自己的项目使用了Rxjava和Okhttp,所以考虑方便,使用的第三种方法;
关键代码:
@Override
public Response intercept(Chain chain) throws IOException {
Request originalRequest = chain.request();
Response originalResponse = chain.proceed(originalRequest);
if (originalResponse.code() == 500 || originalResponse.body().string().equals("no login")) {//这里是由于我和后端司机没沟通好,有的端口未登录时请求的是500错误,有的是"no login",按自己实际情况来;
originalResponse.body().close();
Request loginRequest = getLoginRequest();
Response loginResponse = chain.proceed(loginRequest);
if (loginResponse.isSuccessful()) {
loginResponse.body().close();
return chain.proceed(originalRequest);
}
}
******
******
}
private Request getLoginRequest() {
return new Request.Builder()
.url("http://113.106.90.51:xxxx/xxxx/xxxxxx")//
.post(new FormBody.Builder()
.add(Constant.USERNAME, "xxx")
.add(Constant.PWD, "xx")
.build())
.build();
}