OKHttp中的拦截器Interceptor

本文介绍了Interceptor接口的作用及其主要实现类,包括RetryAndFollowUpInterceptor、BridgeInterceptor和CacheInterceptor。这些拦截器分别用于处理请求的重试与重定向、连接应用程序与网络代码以及缓存请求与响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:简介

Interceptor接口:观察,修改并潜在地将请求发出的短路和相应的短路响应返回。通常,拦截器添加,删除或转换请求中的标头

 或响应。主要方法:Response intercept(Chain chain) throws IOException,此方法中的参数Chain接口也是在Interceptor中定义的。

实现类:

1. RetryAndFollowUpInterceptor:主要用于从故障中恢复或者执行重定向。(失败重连).   

              • 建立StreamAllocation对象,
              • 调用Chain的proceed方法发起请求
              • 根据异常结果或者请求结果,判断是否要重新请求
              • 调用下一个拦截器对Response进行处理

2. BridgeInterceptor:从应用程序代码到网络代码的桥梁。 首先它从用户请求建立一个网络请求。 然后继续呼叫网络。 最后,它从网络响应中建立用户响应。设置内容长度,编码,压缩等等

  • 负责将用户构建的Request转化为能够进行网络访问的请求
  • 将这个Request进行网络请求
  • 将网络请求的响应转化为用户可用的Response

3.CacheInterceptor:提供来自缓存的请求并将响应写入缓存

### OkHttp拦截器的创建与使用 #### 创建自定义拦截器 为了在 OkHttp 请求过程中加入特定逻辑处理,可以创建自定义拦截器。通过继承 `Interceptor` 接口并重写其唯一的抽象方法 `intercept()` 来实现。 ```java public class MyCustomInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request originalRequest = chain.request(); // 修改请求头或其他属性前的操作 Request modifiedRequest = originalRequest.newBuilder() .header("My-Custom-Header", "HeaderValue") .build(); long startTime = System.nanoTime(); // 记录开始时间 try (Response response = chain.proceed(modifiedRequest)) { // 将修改后的请求传递给下一个拦截器 // 响应返回后可在此处做日志记录等操作 long endTime = System.nanoTime(); Log.d("OkHttp", String.format("Received response for %s in %.1fms", response.request().url(), (endTime - startTime) / 1e6d)); return response; } } } ``` #### 添加到 OkHttpClient 实例中 一旦实现了自己的拦截器类,则可以通过构建 `OkHttpClient.Builder` 对象来注册这些拦截器: ```java OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new MyCustomInterceptor()) // 添加自定义拦截器 .build(); ``` 对于需要在网络层面上工作的场景(比如添加公共参数),应该考虑使用应用级拦截器;而对于想要针对单个请求做一些特殊处理的情况,则更适合采用链路级别的拦截器[^4]。 #### 日志拦截器的应用实例 除了编写自定义业务逻辑外,还可以方便地利用官方提供的 Logging 拦截器来进行调试目的的日志打印功能: ```kotlin // Kotlin 示例代码 val logging = HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY // 设置日志级别为 BODY 显示全部内容 } val okHttpClient = OkHttpClient.Builder() .addInterceptor(logging) .build() ``` 上述配置会使得每一次 HTTP 调用的相关信息都被输出至控制台,这对于开发阶段排查问题非常有帮助[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值