OkHttp完全解析(一)

以 3.14.9版本为例,这应该是最后一个java版本了,后面的版本都是kotlin开发的。

implementation 'com.squareup.okhttp3:okhttp:3.14.9'

本文从Address出发,大致介绍了与Address相关的所有类的职责。

HttpUrl

一个完整的url可以包含哪些内容?

看一下这个类的构造方法

HttpUrl(Builder builder) {
    this.scheme = builder.scheme;
    this.username = percentDecode(builder.encodedUsername, false);
    this.password = percentDecode(builder.encodedPassword, false);
    this.host = builder.host;
    this.port = builder.effectivePort();
    this.pathSegments = percentDecode(builder.encodedPathSegments, false);
    this.queryNamesAndValues = builder.encodedQueryNamesAndValues != null
        ? percentDecode(builder.encodedQueryNamesAndValues, true)
        : null;
    this.fragment = builder.encodedFragment != null
        ? percentDecode(builder.encodedFragment, false)
        : null;
    this.url = builder.toString();
}

前面几个数据拆解了url中的不同部分,包括:协议、用户名、密码、域名、端口、路径、参数、锚位。

builder.toString() 将各个部分组合为一个整体,如下:
http://username:password@jianshu.com:80/path1/path2?Key1=value1&key2=value2#anchor

Dns - domain name service

域名查询服务,通过域名获取主机IP地址。
InetAddress 表示一个IP地址,这个类没有开放的构造方法,必须使用getXX静态方法创建。

SocketFactory 和 SSLSocketFactory

套接字工厂,SSL套接字工厂, java SDK 内容。

Authenticator 账号校验

抢先验证和反应式验证

抢先验证:用http代理服务器实现https请求时,需要进行抢先验证。
反应式验证:服务端反馈401或407时,需要提交账号信息用于验证。

401: 用户没有[访问权限, 需要进行身份认证。
407:客户应首先通过代理服务器验证。

OkHttpClient 包含两个实例用于验证,分别为authenticator用于验证原始服务器账号、proxyAuthenticator 用于验证代理服务器账号。

Protocol

这是个枚举类, 包含以下数据
http/1.0 默认情况下不使用持久套接字,明文请求,过时
http/1.1 包含持久连接,明文请求
spdy/3.1 OkHttp不再支持该协议,使用http2.0
h2 就是http2.0,支持请求头压缩、多路复用、服务推送。
h2_prior_knowledge 明文http2.0
quic 快速udp网络连接,okhttp不支持,但可以通过拦截器实现支持。

ConnectionSpec

连接规定。
指定ssl的加密算法 - 或不指定加密算法。

CipherSuite

加密算法
这个类里面只有一个算法的名称,没有具体的算法实现逻辑。
类会缓存算法名称对应的CipherSuite对象

TlsVersion

TLS的版本号

  TLS_1_3("TLSv1.3"), // 2016.
  TLS_1_2("TLSv1.2"), // 2008.
  TLS_1_1("TLSv1.1"), // 2006.
  TLS_1_0("TLSv1"),   // 1999.
  SSL_3_0("SSLv3"),   // 1996.

Proxy 和 ProxySelector

代理服务器设置和代理服务器选择器,java SDK内容。
参考: https://blog.csdn.net/qq_33022345/article/details/53453585

CertificatePinner 和 Pin

锁定SSL证书。
给指定的域名提供固定的证书,那该域名只有使用这个固定证书时才能正常访问。如果服务端证书改变,将无法访问。

Address

一个服务器地址的表示。
本文以上提到的所有类,都被用于Address类中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容