0: 工作中遇到使用拦截器的问题,写这篇文章以作记录。
1: OkHttp 内部是使用拦截器来完成请求和响应的,利用的是责任链设计模式,所以可以说,拦截器是 OkHttp 的精髓所在。
2: 假设现在后台要求我们在请求 API 接口时,都在每一个接口的请求头上添加对应的 token 。使用 Retrofit 比较多的同学肯定会条件反射出以下代码:
@FormUrlEncoded @POST("/mobile/login.htm") Call<ResponseBody> login(@Header("token") String token, @Field("mobile") String phoneNumber, @Field("smsCode") String smsCode);这样的写法自然可以,无非就是每次调用 login API 接口时都把 token 传进去而已。但是需要注意的是,假如现在有十多个 API 接口,每一个都需要传入 token ,难道我们去重复一遍又一遍吗?
相信有良知的程序员都会拒绝,因为这会导致代码的冗余。
3: 那么有没有好的办法可以一劳永逸呢?答案是肯定的,那就要用到拦截器了。
代码很简单:
public class TokenHeaderInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { // get token String token = AppService.getToken(); Request originalRequest = chain.request(); // get new request, add request header Request updateRequest = originalRequest.newBuilder() .header("token", token) .build(); return chain.proceed(updateRequest); } }我们先拦截得到 originalRequest ,然后利用 originalRequest 生成新的 updateRequest ,再交给 chain 处理进行下一环。
最后,在 OkHttpClient 中使用:
OkHttpClient client = new OkHttpClient.Builder() .addNetworkInterceptor(new TokenHeaderInterceptor()) .build(); Retrofit retrofit = new Retrofit.Builder().baseUrl(BuildConfig.BASE_URL) .client(client).addConverterFactory(GsonConverterFactory.create()).build();这里只是最简单的用法还有别的用法,自行研究吧
