拦截器是OkHttp处理HTTP请求方面所具有的一个强大特性,这里我们就来看一下Android的OkHttp包中的HTTP拦截器Interceptor用法示例,需要的朋友可以参考下:

OkHttp(GitHub:https://github.com/square/okhttp) 的 Interceptor 就如同名称「拦截器」一样,拦截你的 Request 做一些你想做的事情再送出去。例如:
1.自动加上使用者目前使用的语言送出去取得对应语言的回传内容。
2.将 Request 计算出这个 Request 的 sigunature 再附加上送出去。
在 okHttp 中分成 Application Interceptor 和 Network Interceptor 两种。 Application Interceptor 是会可以被 cache 起来的。如官网的图片: 



拦截器是 OkHttp 提供的对 HTTP 请求和响应进行统一处理的强大机制。拦截器在实现和使用上类似于 Servlet 规范中的过滤器。多个拦截器可以链接起来,形成一个链条。拦截器会按照在链条上的顺序依次执行。 拦截器在执行时,可以先对请求的 Request 对象进行修改;再得到响应的 Response 对象之后,可以进行修改之后再返回。
Interceptor 接口只包含一个方法 intercept,其参数是 Chain 对象。Chain 对象表示的是当前的拦截器链条。通过 Chain 的 request 方法可以获取到当前的 Request 对象。在使用完 Request 对象之后,通过 Chain 对象的 proceed 方法来继续拦截器链条的执行。当执行完成之后,可以对得到的 Response 对象进行额外的处理。
记录请求和响应信息的拦截器:



   

                     
public class LoggingInterceptor implements Interceptor {     public Response intercept(Chain chain) throws IOException {         Request request = chain.request();           long t1 = System.nanoTime();         System.out.println(String.format( "发送请求: [%s] %s%n%s" ,         request.url(), chain.connection(), request.headers()));           Response response = chain.proceed(request);           long t2 = System.nanoTime();         System.out.println(String.format( "接收响应: [%s] %.1fms%n%s" ,         response.request().url(), (t2 - t1) / 1e6d, response.headers()));           return response;    } }

OkHttp 中的拦截器分成应用和网络拦截器两种。应用拦截器对于每个 HTTP 响应都只会调用一次,可以通过不调用 Chain.proceed 方法来终止请求,也可以通过多次调用 Chain.proceed 方法来进行重试。网络拦截器对于调用执行中的自动重定向和重试所产生的响应也会被调用,而如果响应来自缓存,则不会被调用。
添加应用和网络拦截器




client.interceptors().add( new LoggingInterceptor()); //添加应用拦截器 client.networkInterceptors().add( new LoggingInterceptor()); //添加网络拦截器

要做计算 Request 的 sigunature ,则使用方式如下:



                                                     
public class ApiClient {     Interceptor signedRequestInterceptor = new Interceptor() {         @Override         public Response intercept(Chain chain) throws IOException {             Response response = null ;             try {                 Request originalRequest = chain.request();                 Request signedRequest = SignRequestUtil.signRequest(originalRequest);                 response = chain.proceed(signedRequest);             } catch (NoSuchAlgorithmException | InvalidKeyException e) {                 e.printStackTrace();             }               return response;          }     };        OkHttpClient client = new OkHttpClient();      client.networkInterceptors().add(signedRequestInterceptor); }
public class SignRequestUtil {     public static Request signRequest(Request originalRequest) {         Request.Builder requestBuilder = originalRequest.newBuilder();           // 在这做所有你需要做的事情,重新产生一个 Request 送出去。        return requestBuilder .headers(getSignedHeaders(originalRequest)) .build();     } }
 转自:http://www.jb51.net/article/88511.htm

更多相关文章

  1. 页面跳转与传值(Activity跳转与传值)
  2. Android(安卓)Intent 传递二进制数值的两种方法
  3. Android基于DataBinding的一个基础框架
  4. Android学习五 网络编程与handler消息机制
  5. Small宝典(一)Android(安卓)Small框架源码解析
  6. Flutter中高级培训
  7. Android(安卓)IT资讯网络阅读器应用源码
  8. Android(安卓)ORM框架 LiteOrm使用
  9. android阿里面试java基础锦集

随机推荐

  1. ViewBinding的简单使用
  2. Android广播接收器BroadcastReceiver——
  3. Android(安卓)四大组件:这是一份全面 & 详
  4. android 传感器的使用
  5. 【Android自学笔记】Android中的Log小技
  6. Android短信发送流程之长短信发送(原)
  7. Android DownloadManager下载进度查询(系
  8. Android 常用的提示框,输入框,弹窗
  9. Android(安卓)添加系统设置属性的实现及
  10. android phone模块 4.2平台和4.4平台上的