返回顶部
首页 > 资讯 > 移动开发 >Android的OkHttp包中的HTTP拦截器Interceptor用法示例
  • 729
分享到

Android的OkHttp包中的HTTP拦截器Interceptor用法示例

okhttp示例Android 2022-06-06 08:06:51 729人浏览 泡泡鱼
摘要

OkHttp(GitHub:https://github.com/square/okhttp) 的 Interceptor 就如同名称「拦截器」一样,拦截你的 Request

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

2016713112153384.png (1200×1100)

拦截器是 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();
 }
}

您可能感兴趣的文章:详解Android中使用OkHttp发送HTTP的post请求的方法Android中Retrofit+OkHttp进行HTTP网络编程的使用指南详解Android使用OKHttp3实现下载(断点续传、显示进度)Android中Okhttp3实现上传多张图片同时传递参数Android OkHttp Post上传文件并且携带参数实例详解Android中的Retrofit+OkHttp+RxJava缓存架构使用Android中okhttp3使用详解Android使用okHttp(get方式)下载图片android中实现OkHttp下载文件并带进度条Android Okhttp断点续传面试深入解析


--结束END--

本文标题: Android的OkHttp包中的HTTP拦截器Interceptor用法示例

本文链接: https://lsjlt.com/news/24663.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作