返回状态码比如401,一般表示身份无效,比如token失效之类的,这个时候就需要调用接口刷新token,
肯定不能在每个接口请求回调那里去刷新,要是一个APP有几百个接口不是很麻烦吗,那么retrofit怎么拦截这个
401做统一处理呢,直接上代码:
Interceptor tokenInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(request);
// 对返回code统一拦截
if (response != null) {
if (response.code() == ResultCode.ACCESS_TOKEN_EXPIRED.getCode()) {
} else if (response.code() == ResultCode.SUCCESS_NO_RESPONSE.getCode()) {
}
}
return response;
}
};
OkHttpClient client = new OkHttpClient.Builder()
.retryOnConnectionFailure(true) // 是否重试
.connectTimeout(10, TimeUnit.SECONDS) // 连接超时事件
.addNetworkInterceptor(tokenInterceptor) // 自动附加 token
//.authenticator(authenticator) // 认证失败自动刷新token
.addInterceptor(interceptor.setLevel(HttpLoggingInterceptor.Level.BODY))
.build();
retrofit = new Retrofit.Builder()
.baseUrl(APIConfig.getUserAPIHost())
.client(client)
.addConverterFactory(GsonConverterFactory.create(GSON))
.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
.build();
第7行开始就可以根据返回的状态码来做自己想要的事情了
我们知道返回状态码200系列都算是成功的,但是比如遇到204呢,也是成功但无返回值,那么我们该如何处理呢?
这种情况是个别请求才会遇到的,所以就不统一处理了,在发起请求代码处处理就可以了,直接看代码吧:
@PUT(Constant.METHOD_PASSWORD_MODIFY)
@FormUrlEncoded
Flowable<Response<Void>> fetchModifyPassword(@Query("access_token") String accessToken, @Field("pwd") String password);
private void fetchModifyPassword(String passwordTwo) {
UserRetrofit.api().fetchModifyPassword(UserUtils.getAccessToken(), passwordTwo)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Response>() {
@Override
public void accept(@NonNull Response result) {
Toast.makeText(getContext(), "修改密码成功", Toast.LENGTH_LONG).show();
getActivity().onBackPressed();
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
throwable.printStackTrace();
}
});
}
第3、8行,看懂了吧,这里解析就不要用我们写的实体类了,直接用retrofit提供的实体Response<Void>
好了,又可以愉快玩耍了