OkHttp梳理

OkHttp梳理

OkHttp的使用

  • 添加依赖

  • 基本代码

    class Util{
        public static void sendRequest(String url, Callback callback) {
            RequestBody requestBody = new FormBody.Builder()
                    .add("key","content")
                    .build();
            Request request = new Request.Builder()
                    .url(url)
                    .build();
            OkHttpClient client = new OkHttpClient();
            client.newCall(request).enqueue(callback);//异步请求的方式
            //同步请求方式则是调用execute方法,并且有Response类型的返回值。
        }
    }
    

OkHttp的原理

  • OkHttp子系统层级结构

    • 网络配置层
    • 重定向层
    • Header拼接层
    • HTTP缓存层
    • 网络连接层
    • 数据响应层
  • 五个默认拦截器

    • RetryAndFollowUpInterceptor(重试重定向拦截器)

      当请求内部抛出异常的时候,判定是否需要重试;当响应结果是3xx重定向的时候,决定是否构建一个新的请求并发送请求。

    • BridgeInterceptor(连接桥拦截器)

      负责把用户构造的请求转换为发送到服务器的请求 ,转换的过程就是添加一些服务端需要的header信息;以及把服务器返回的响应转换为用户友好的响应,是从应用程序代码到网络代码的桥梁。在Request阶段配置用户信息,并添加一些请求头。在Response阶段,进行gzip解压。

    • CacheInterceptor(缓存拦截器)

      负责读取缓存以及更新缓存。

    • ConnectInterceptor(连接拦截器)

      负责和服务器建立连接,这里才是真正的请求网络。同时负责了Dns解析和Socket连接(包括tls连接)。

    • CallServerInterceptor(请求服务拦截器)

      执行流操作(写出请求体、获得响应数据) ,负责向服务器发送请求数据,从服务器读取响应数据,进行HTTP请求报文的封装与响应报文的解析。它是最后一个拦截器了,前面的拦截器已经完成了socket连接和tls连接,那么这一步就是传输HTTP的头部和body数据了。以及读取 response header,先构造一个 Response 对象,如果有 response body,就在 response header 的基础上加上 body 构造一个新的 Response 对象。

  • 连接机制

    • 创建连接
    • 连接池

涉及的设计模式

  • 建造者模式

    网络配置层,利用Builder模式配置各种参数。

  • 工厂方法

  • 职责链模

    一个Interceptor对应一个功能,所有Interceptor连接成一个Interceptor.Chain,典型的责任链模式实现。

参考:

OPPO互联网基础技术团队-OkHttp源码深度解析

郭孝星-Android开源框架源码鉴赏:Okhttp

Andriod 网络框架 OkHttp 源码解析

原文地址:https://www.cnblogs.com/chen-ying/p/12341421.html