Android的OkHttp包中的HTTP * Interceptor用法示例

作者:bng86 时间:2022-01-31 06:31:25 

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

Android的OkHttp包中的HTTP * Interceptor用法示例

* 是 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
0
投稿

猜你喜欢

  • Java 异常的栈轨迹(Stack Trace)详解及实例代码

    2023-12-13 12:19:02
  • java实现简单单链表

    2023-10-30 09:45:46
  • springboot2.x使用Jsoup防XSS攻击的实现

    2023-11-17 06:40:47
  • java创建线程的两种方法区别

    2023-11-11 09:17:52
  • flutter传递值到任意widget(当需要widget嵌套使用需要传递值的时候)

    2022-05-17 22:53:44
  • 浅谈几种常见语言的命名空间(Namespace)

    2022-11-13 12:17:42
  • Java annotation元注解原理实例解析

    2022-09-08 00:42:45
  • Android实现一个丝滑的自动轮播控件实例代码

    2022-01-24 03:08:19
  • JavaWeb使用POI操作Excel文件实例

    2022-06-12 18:19:30
  • Android生成带圆角的Bitmap图片

    2022-09-08 11:18:19
  • Android开发中使用Intent打开第三方应用及验证可用性的方法详解

    2021-08-12 19:28:47
  • Java控制台输入数组并逆序输出的方法实例 <font color=red>原创</font>

    2023-07-13 23:32:26
  • Android自定义View实现渐变色进度条

    2022-11-25 08:27:17
  • SpringBoot带你实现一个点餐小程序

    2022-04-01 23:38:08
  • java动态导出excel压缩成zip下载的方法

    2022-07-13 07:29:27
  • 基于Java代码操作Redis过程详解

    2022-03-28 06:53:58
  • Android项目实现视频播放器

    2022-10-05 07:53:35
  • android ListView和GridView拖拽移位实现代码

    2023-05-19 18:27:01
  • C#解析json字符串总是多出双引号的原因分析及解决办法

    2022-10-22 02:40:46
  • ZooKeeper入门教程一简介与核心概念

    2022-11-24 18:36:00
  • asp之家 软件编程 m.aspxhome.com