一、Application Interceptor是在请求执行刚开始,还没有执行OkHttp的核心代码前进行拦截,Application拦截器的作用:1、不需要担心是否影响OKHttp的请求策略和请求速度。2、即使是从缓存中取数据,也会执行Application拦截器。3、允许重试,即Chain.PRoceed()可以执行多次。(当然请不要盲目执行多次,需要加入你的逻辑判断)二、Network Interception是在连接网络之前(如图,看图一目了然)1、可以修改OkHttp框架自动添加的一些属性(当然最好不要修改)。2、可以观察最终完整的请求参数(也就是最终服务器接收到的请求数据和熟悉)实例化一个拦截器Interceptor appInterceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); //---------请求之前------------ Response response = chain.proceed(request1); //---------请求之后------------ return response; } };复制代码配置拦截器okHttpClient = new OkHttpClient .Builder() .addInterceptor(appInterceptor)//Application拦截器 .addNetworkInterceptor(networkInterceptor)//Network拦截器 .build();复制代码其中通过addInterceptor添加应用拦截器,addNetworkInterceptor添加网络拦截器。示例代码public class InterceptorActivity extends AppCompatActivity { public static final String TAG = "androidxx"; OkHttpClient okHttpClient; /** * 应用拦截器 */ Interceptor appInterceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); HttpUrl url = request.url(); String s = url.url().toString(); //---------请求之前----- Log.d(TAG,"app interceptor:begin"); Response response = chain.proceed(request); Log.d(TAG,"app interceptor:end"); //---------请求之后------------ return response; } }; /** * 网络拦截器 */ Interceptor networkInterceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); //---------请求之前----- Log.d(TAG,"network interceptor:begin"); Response response = chain.proceed(request); Log.d(TAG,"network interceptor:end"); return response; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_interceptor); okHttpClient = new OkHttpClient .Builder() .addInterceptor(appInterceptor)//Application拦截器 .addNetworkInterceptor(networkInterceptor)//Network拦截器 .build(); } public void click(View view) { Request request = new Request.Builder().url("http://www.androidxx.cn").build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { Log.d(TAG,"--" + response.networkResponse()); } }); }}复制代码执行结果如下:
可以看到,从App Interceptor开始,然后执行Network Interceptor,最后又回到App Interceptor.建议如果对拦截器不是很熟的同学,开发过程中,建议使用Application Interception。这样避免对OkHttp请求策略的破坏。实际开发中的用途1、对请求参数进行统一加密处理。2、拦截不符合规则的URL。3、对请求或者返回参数设置统一的编码方式4、其它...。比如对URL进行验证(如果Url中没有包含androidxx关键字,则修改请求链接为http://www.androidxx.cn),代码如下:Interceptor appInterceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); HttpUrl url = request.url(); String s = url.url().toString();Response response = null; //如果Url中没有包含androidxx关键字,则修改请求链接为http://www.androidxx.cn if (s.contains("androidxx")) { request = request.newBuilder().url("http://www.androidxx.cn").build(); } response = chain.proceed(request);return response; } };复制代码注意OkHttp的拦截器是在OkHttp2.2之后才可以使用,并且拦截器不能与Retrofit ≤ 1.8和Picasso ≤ 2.4框架同时使用。新闻热点
疑难解答