1. OkHttp的拦截机制
OkHttp的拦截机制运用了责任链设计模式,允许拦截器以链式方式工作,每个拦截器都可以处理请求和响应,并将请求或响应传递给链中的下一个拦截器。这种机制极大地增强了OkHttp的灵活性和可扩展性。
具体来说,每个拦截器在OkHttp的请求/响应流程中扮演着“处理者”的角色,它们可以根据需要修改请求(如添加头信息、执行身份验证)、处理响应(如检查状态码、读取响应体)或执行诸如重试逻辑、重定向、日志记录等高级功能。每个拦截器完成其工作后,都会调用链中的下一个拦截器,直到请求被发送到服务器或响应被完全处理。
OkHttp提供了五种内置的拦截器实现请求到响应的基本需求,并且可以自定义拦截器实现定制化的需求,源码参考具体如下。
OkHttp的拦截链如图所示:
2. RetryAndFollowUpInterceptor
RetryAndFollowUpInterceptor的源码如下:
这段源码说明了当执行发生RouteException和IOException的时候,会根据recover方法的返回判断是否重试。
需要关注的是第一个判断if (!client.retryOnConnectionFailure),这个是能直接影响的并且可以控制是否重试的一个参数,当在构建OkHttpClient的时候可以设置该参数。
当调用成功获取返回之后,又会校验响应中是否有重定向参数,然后重新组装请求参数,继续循环调用处理请求。重定向的最大次数MAX_FOLLOW_UPS=20次。
followUpRequest是构建重定向的请求,从源码中可以知道会根据响应CODE决定是否重试和发送重定向请求。
当响应CODE是3XX的时候,会构建重定向请求。
构建重定向的时候需要关注的是if (!client.followRedirects) 这个判断,这个配置是在构建OKHttpClient的时候设置的值。当配置了这个属性的时候会发送重定向请求。
从源码中可以看出RetryAndFollowUpInterceptor的主要作用重试和重定向。并且可以在构建OkHttpClient的时候设置是否启用RetryAndFollowUpInterceptor的重试和重定向功能,最大重定向次数为20次。构建OkHttpClient的时候,内置的提供的Builder的followRedirects方法和retryOnConnectionFailure可以设置是否重定向和重试。
3. BridgeInterceptor
BridgeInterceptor的源码说明为应用层到网络层的桥梁。首先会根据用户请求构建网络请求,然后继续在拦截链中传送,最终从网络响应中构建用户响应。源码如下:
当请求执行到BridgeInterceptor之后,首先会根据Request获取一个新的Request.Builder,然后根据用户请求构建新的Request,对请求添加Content-Type、Content-Length、Transfer-Encoding、Host、Connection、Accept-Encoding、Cookie、User-Agent,将请求转换成网络层真正可执行的请求。
网络请求处理完成之后,首先会处理Cookie,如果有将响应header中的cookie存入cookieJar,然后构建用户响应对象返回。
4. CacheInterceptor
缓存拦截器提供网络请求缓存的读取。如果每次请求都经过网络的发送和读取,会很耗时。CacheInterceptor的作用就是缓存请求的响应。默认是没有处理Cache的,构建OkHttpClient的时候设置自己的Cache。是否使用缓存可以在构建Request的时候,设置请求对应的CacheControl。请求缓存会根据是否配置使用缓存,是否有Cache,缓存的有效时间,缓存的策略综合计算。
5. ConnectInterceptor
ConnectInterceptor的核心功能如下:
(1)建立连接:在发送请求之前,ConnectInterceptor负责与目标服务器建立连接。这包括解析主机名、创建Socket连接等操作。OkHttp支持连接池来重用之前已经建立的连接,从而提高性能和减少延迟。OkHttpClient有默认的ConnectionPool,也可以在构建OkHttpClient的时候设置自己的ConnectionPool。
(2)SSL握手:如果请求需要通过HTTPS发送,ConnectInterceptor还负责进行SSL握手,确保通信的安全性。这一步骤包括与服务器协商加密算法、验证证书有效性等。
(3)代理服务器支持:如果请求需要通过代理服务器发送,ConnectInterceptor也会负责与代理服务器建立连接,并通过代理服务器转发请求到目标服务器。
6. CallServerInterceptor
CallServerInterceptor的核心功能是发起网络请求,接受处理响应,核心是使用okio实现读写,而okio实际上还是用的Socket。
7. 自定义拦截器
OkHttp提供了强大的拦截机制,允许开发者在请求发送前后、响应接收前后插入自定义逻辑。默认情况下,OkHttp已经内置了几个核心拦截器来处理诸如缓存、重试、连接复用等关键功能。然而,为了满足特定业务场景下的定制化要求,OkHttp同样支持自定义拦截器。
自定义拦截器示例如下:
public class CustomInterceptor implements Interceptor {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
// TODO 自定义拦截逻辑
Request request = chain.request();
String url = request.url().toString();
System.out.println("intercept: proceed start: url" + url + ", at " + System.currentTimeMillis());
Response rep = chain.proceed(request);
System.out.println("intercept: proceed end: url" + url + ", at " + System.currentTimeMillis());
return rep;
}
}
标签:拦截器,请求,JDK,响应,调用,构建,OkHttp,工具,重定向
From: https://blog.csdn.net/pig_Struggle/article/details/140525263