区块链技术博客
www.b2bchain.cn

OkHttp源码剖析(一) 初识okhttp求职学习资料

本文介绍了OkHttp源码剖析(一) 初识okhttp求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

使用示例

本篇主要基于okhttp-4.9.0进行分析。下面是OkHttp主要的使用示例。

        OkHttpClient client = new OkHttpClient.Builder().build();         Request request = new Request                 .Builder()                 .url("https://www.yanfriends.com")                 .build();         client.newCall(request).enqueue(new Callback() {             @Override             public void onFailure(Call call, IOException e) {              }              @Override             public void onResponse(Call call, Response response) throws IOException {                 Log.e("okhttp response", response.body().string() );             }         });

架构图

OkHttp的流程图大致如下图所示,这里先有个大致感观,每一环的细节都会在接下来的章节中说到,再看完所有章节后回过头来再看下,会对OkHttp的整个流程架构有清晰的认识。

OkHttp源码剖析(一) 初识okhttp

本质理解

http的连接本质上是个socket,根据http协议,通过socket包装发送请求并获得返回结果。

网路连接库一开始的样子如下代码所示,其实只要符合Http协议的请求,就可以和网络进行交互,类似于OkHttp的网络请求库,帮助开发者方便和屏蔽了Http协议中类似于请求头,重连、合并、代理、返回结果解析等等Http协议细节的应用层实现。

        val path = "http://www.baidu.com/"         val host = "www.baidu.com"         var socket: Socket? = null         var streamWriter: OutputStreamWriter? = null         var bufferedWriter: BufferedWriter? = null         try {             socket = Socket(host, 80)             streamWriter = OutputStreamWriter(socket.getOutputStream())             bufferedWriter = BufferedWriter(streamWriter)             bufferedWriter.write("GET $path HTTP/1.1rn")             bufferedWriter.write("Host: www.baidu.comrn")             bufferedWriter.write("rn")             bufferedWriter.flush()             val myRequest = BufferedReader(InputStreamReader(socket.getInputStream(), "UTF-8"))             var d = -1             while (myRequest.read().also({ d = it }) != -1) {                 print(d.toChar())             }         } catch (e: IOException) {             e.printStackTrace()         }

OkHttpClient

OkHttpClient是整个OkHttp的配置中心。

所有的call请求都会共享OkHttpClient中的配置,如出错重试、连接池、日志、各种拦截器等。

OkHttpClient实现看Call.Factory接口,是Call的工厂类,生产 Call并通过 Call 来发起 HTTP Request 获取 Response。

OkHttpClient应该被共享,使用时保持单例,因为每个Client 都会有一个自己的连接池和线程池,复用 Client 可以减少资源的浪费。

OkHttpClient 中的配置主要有:

  • Dispatcher dispatcher:用于调度后台发起的网络请求的调度器, 有后台总请求数和单主机总请求数的控制。

  • List<Protocol> protocols :支持的应用层协议,即 HTTP/1.1、 HTTP/2 等。

  • List<ConnectionSpec> connectionSpecs :应用层支持的 Socket 设置,即使用明文传输(用于 HTTP)还是某个版本的 TLS(用于 HTTPS)。

  • List<Interceptor> interceptors :大多数时候使用的 Interceptor 都应该配置到这里。

  • List<Interceptor> networkInterceptors:直接和网络请求交互 的 Interceptor 配置到这里,例如如果你想查看返回的 301 报文或者未解压 的 Response Body,需要在这里看。

  • CookieJar cookieJar:管理 Cookie 的控制器。OkHttp 提供了 Cookie 存取的判断支持(即什么时候需要存 Cookie,什么时候需要读取 Cookie,但没有给出具体的存取实现。如果需要存取 Cookie,你得自己写实现,例如用 Map 存在内存里,或者用别的方式存在本地存储或者数据库。

  • Cache cache :Cache 存储的配置。默认是没有,如果需要用,得自己配置出 Cache 存储的文件位置以及存储空间上限。

  • HostnameVerifier hostnameVerifier :用于验证 HTTPS 握手过程 中下载到的证书所属者是否和自己要访问的主机名一致。

  • CertificatePinner certificatePinner :用于设置 HTTPS 握手 过程中针对某个 Host 额外的的 Certificate Public Key Pinner,即把网站证 书链中的每一个证书公钥直接拿来提前配置进 OkHttpClient 里去,作为正 常的证书验证机制之外的一次额外验证。

  • Authenticator authenticator :用于自动重新认证。配置之后,在 请求收到 401 状态码的响应是,会直接调用 authenticator ,手动加 入 Authorization header 之后自动重新发起请求。

  • boolean followRedirects:是否允许重定向

  • boolean followSslRedirects :不是是否自动 follow HTTPS URL,是在重定向时发生了协议切换 ,是否允许,默认 true。

  • 重定向的意思,而是是否自动 follow 在 HTTP 和 HTTPS 之间切换的重定向。

  • boolean retryOnConnectionFailure :在请求失败的时候是否自动 重试。注意,大多数的请求失败并不属于 OkHttp 所定义的「需要重试」, 这种重试只适用于「同一个域名的多个 IP 切换重试」「Socket 失效重试」 等情况。

  • int connectTimeout :建立连接(TCP 或 TLS)的超时时间,默认十秒;
    int readTimeout :发起请求到读到响应数据的超时时间,默认十秒;
    int writeTimeout :发起请求并被目标服务器接受的超时时间。(因为有时候对方服务器可能由于某种原因而不读取你的 Request),默认十秒;

粗识okhttp

OkHttp中的细节很多,这里不过分深入,只需有个大致的结构认识即可,一些细节会在接下来的文章中具体分析。

RealCall初始化

使用OkHttpClient.newCall()创建RealCall和Transmitter类,Transmitter类可以将okhttp和网络层连接起来。

使用示例

本篇主要基于okhttp-4.9.0进行分析。下面是OkHttp主要的使用示例。

        OkHttpClient client = new OkHttpClient.Builder().build();         Request request = new Request                 .Builder()                 .url("https://www.yanfriends.com")                 .build();         client.newCall(request).enqueue(new Callback() {             @Override             public void onFailure(Call call, IOException e) {              }              @Override             public void onResponse(Call call, Response response) throws IOException {                 Log.e("okhttp response", response.body().string() );             }         });

架构图

OkHttp的流程图大致如下图所示,这里先有个大致感观,每一环的细节都会在接下来的章节中说到,再看完所有章节后回过头来再看下,会对OkHttp的整个流程架构有清晰的认识。

OkHttp源码剖析(一) 初识okhttp

本质理解

http的连接本质上是个socket,根据http协议,通过socket包装发送请求并获得返回结果。

网路连接库一开始的样子如下代码所示,其实只要符合Http协议的请求,就可以和网络进行交互,类似于OkHttp的网络请求库,帮助开发者方便和屏蔽了Http协议中类似于请求头,重连、合并、代理、返回结果解析等等Http协议细节的应用层实现。

        val path = "http://www.baidu.com/"         val host = "www.baidu.com"         var socket: Socket? = null         var streamWriter: OutputStreamWriter? = null         var bufferedWriter: BufferedWriter? = null         try {             socket = Socket(host, 80)             streamWriter = OutputStreamWriter(socket.getOutputStream())             bufferedWriter = BufferedWriter(streamWriter)             bufferedWriter.write("GET $path HTTP/1.1rn")             bufferedWriter.write("Host: www.baidu.comrn")             bufferedWriter.write("rn")             bufferedWriter.flush()             val myRequest = BufferedReader(InputStreamReader(socket.getInputStream(), "UTF-8"))             var d = -1             while (myRequest.read().also({ d = it }) != -1) {                 print(d.toChar())             }         } catch (e: IOException) {             e.printStackTrace()         }

OkHttpClient

OkHttpClient是整个OkHttp的配置中心。

所有的call请求都会共享OkHttpClient中的配置,如出错重试、连接池、日志、各种拦截器等。

OkHttpClient实现看Call.Factory接口,是Call的工厂类,生产 Call并通过 Call 来发起 HTTP Request 获取 Response。

OkHttpClient应该被共享,使用时保持单例,因为每个Client 都会有一个自己的连接池和线程池,复用 Client 可以减少资源的浪费。

OkHttpClient 中的配置主要有:

  • Dispatcher dispatcher:用于调度后台发起的网络请求的调度器, 有后台总请求数和单主机总请求数的控制。

  • List<Protocol> protocols :支持的应用层协议,即 HTTP/1.1、 HTTP/2 等。

  • List<ConnectionSpec> connectionSpecs :应用层支持的 Socket 设置,即使用明文传输(用于 HTTP)还是某个版本的 TLS(用于 HTTPS)。

  • List<Interceptor> interceptors :大多数时候使用的 Interceptor 都应该配置到这里。

  • List<Interceptor> networkInterceptors:直接和网络请求交互 的 Interceptor 配置到这里,例如如果你想查看返回的 301 报文或者未解压 的 Response Body,需要在这里看。

  • CookieJar cookieJar:管理 Cookie 的控制器。OkHttp 提供了 Cookie 存取的判断支持(即什么时候需要存 Cookie,什么时候需要读取 Cookie,但没有给出具体的存取实现。如果需要存取 Cookie,你得自己写实现,例如用 Map 存在内存里,或者用别的方式存在本地存储或者数据库。

  • Cache cache :Cache 存储的配置。默认是没有,如果需要用,得自己配置出 Cache 存储的文件位置以及存储空间上限。

  • HostnameVerifier hostnameVerifier :用于验证 HTTPS 握手过程 中下载到的证书所属者是否和自己要访问的主机名一致。

  • CertificatePinner certificatePinner :用于设置 HTTPS 握手 过程中针对某个 Host 额外的的 Certificate Public Key Pinner,即把网站证 书链中的每一个证书公钥直接拿来提前配置进 OkHttpClient 里去,作为正 常的证书验证机制之外的一次额外验证。

  • Authenticator authenticator :用于自动重新认证。配置之后,在 请求收到 401 状态码的响应是,会直接调用 authenticator ,手动加 入 Authorization header 之后自动重新发起请求。

  • boolean followRedirects:是否允许重定向

  • boolean followSslRedirects :不是是否自动 follow HTTPS URL,是在重定向时发生了协议切换 ,是否允许,默认 true。

  • 重定向的意思,而是是否自动 follow 在 HTTP 和 HTTPS 之间切换的重定向。

  • boolean retryOnConnectionFailure :在请求失败的时候是否自动 重试。注意,大多数的请求失败并不属于 OkHttp 所定义的「需要重试」, 这种重试只适用于「同一个域名的多个 IP 切换重试」「Socket 失效重试」 等情况。

  • int connectTimeout :建立连接(TCP 或 TLS)的超时时间,默认十秒;
    int readTimeout :发起请求到读到响应数据的超时时间,默认十秒;
    int writeTimeout :发起请求并被目标服务器接受的超时时间。(因为有时候对方服务器可能由于某种原因而不读取你的 Request),默认十秒;

粗识okhttp

OkHttp中的细节很多,这里不过分深入,只需有个大致的结构认识即可,一些细节会在接下来的文章中具体分析。

RealCall初始化

使用OkHttpClient.newCall()创建RealCall和Transmitter类,Transmitter类可以将okhttp和网络层连接起来。

使用示例

本篇主要基于okhttp-4.9.0进行分析。下面是OkHttp主要的使用示例。

        OkHttpClient client = new OkHttpClient.Builder().build();         Request request = new Request                 .Builder()                 .url("https://www.yanfriends.com")                 .build();         client.newCall(request).enqueue(new Callback() {             @Override             public void onFailure(Call call, IOException e) {              }              @Override             public void onResponse(Call call, Response response) throws IOException {                 Log.e("okhttp response", response.body().string() );             }         });

架构图

OkHttp的流程图大致如下图所示,这里先有个大致感观,每一环的细节都会在接下来的章节中说到,再看完所有章节后回过头来再看下,会对OkHttp的整个流程架构有清晰的认识。

OkHttp源码剖析(一) 初识okhttp

本质理解

http的连接本质上是个socket,根据http协议,通过socket包装发送请求并获得返回结果。

网路连接库一开始的样子如下代码所示,其实只要符合Http协议的请求,就可以和网络进行交互,类似于OkHttp的网络请求库,帮助开发者方便和屏蔽了Http协议中类似于请求头,重连、合并、代理、返回结果解析等等Http协议细节的应用层实现。

        val path = "http://www.baidu.com/"         val host = "www.baidu.com"         var socket: Socket? = null         var streamWriter: OutputStreamWriter? = null         var bufferedWriter: BufferedWriter? = null         try {             socket = Socket(host, 80)             streamWriter = OutputStreamWriter(socket.getOutputStream())             bufferedWriter = BufferedWriter(streamWriter)             bufferedWriter.write("GET $path HTTP/1.1rn")             bufferedWriter.write("Host: www.baidu.comrn")             bufferedWriter.write("rn")             bufferedWriter.flush()             val myRequest = BufferedReader(InputStreamReader(socket.getInputStream(), "UTF-8"))             var d = -1             while (myRequest.read().also({ d = it }) != -1) {                 print(d.toChar())             }         } catch (e: IOException) {             e.printStackTrace()         }

OkHttpClient

OkHttpClient是整个OkHttp的配置中心。

所有的call请求都会共享OkHttpClient中的配置,如出错重试、连接池、日志、各种拦截器等。

OkHttpClient实现看Call.Factory接口,是Call的工厂类,生产 Call并通过 Call 来发起 HTTP Request 获取 Response。

OkHttpClient应该被共享,使用时保持单例,因为每个Client 都会有一个自己的连接池和线程池,复用 Client 可以减少资源的浪费。

OkHttpClient 中的配置主要有:

  • Dispatcher dispatcher:用于调度后台发起的网络请求的调度器, 有后台总请求数和单主机总请求数的控制。

  • List<Protocol> protocols :支持的应用层协议,即 HTTP/1.1、 HTTP/2 等。

  • List<ConnectionSpec> connectionSpecs :应用层支持的 Socket 设置,即使用明文传输(用于 HTTP)还是某个版本的 TLS(用于 HTTPS)。

  • List<Interceptor> interceptors :大多数时候使用的 Interceptor 都应该配置到这里。

  • List<Interceptor> networkInterceptors:直接和网络请求交互 的 Interceptor 配置到这里,例如如果你想查看返回的 301 报文或者未解压 的 Response Body,需要在这里看。

  • CookieJar cookieJar:管理 Cookie 的控制器。OkHttp 提供了 Cookie 存取的判断支持(即什么时候需要存 Cookie,什么时候需要读取 Cookie,但没有给出具体的存取实现。如果需要存取 Cookie,你得自己写实现,例如用 Map 存在内存里,或者用别的方式存在本地存储或者数据库。

  • Cache cache :Cache 存储的配置。默认是没有,如果需要用,得自己配置出 Cache 存储的文件位置以及存储空间上限。

  • HostnameVerifier hostnameVerifier :用于验证 HTTPS 握手过程 中下载到的证书所属者是否和自己要访问的主机名一致。

  • CertificatePinner certificatePinner :用于设置 HTTPS 握手 过程中针对某个 Host 额外的的 Certificate Public Key Pinner,即把网站证 书链中的每一个证书公钥直接拿来提前配置进 OkHttpClient 里去,作为正 常的证书验证机制之外的一次额外验证。

  • Authenticator authenticator :用于自动重新认证。配置之后,在 请求收到 401 状态码的响应是,会直接调用 authenticator ,手动加 入 Authorization header 之后自动重新发起请求。

  • boolean followRedirects:是否允许重定向

  • boolean followSslRedirects :不是是否自动 follow HTTPS URL,是在重定向时发生了协议切换 ,是否允许,默认 true。

  • 重定向的意思,而是是否自动 follow 在 HTTP 和 HTTPS 之间切换的重定向。

  • boolean retryOnConnectionFailure :在请求失败的时候是否自动 重试。注意,大多数的请求失败并不属于 OkHttp 所定义的「需要重试」, 这种重试只适用于「同一个域名的多个 IP 切换重试」「Socket 失效重试」 等情况。

  • int connectTimeout :建立连接(TCP 或 TLS)的超时时间,默认十秒;
    int readTimeout :发起请求到读到响应数据的超时时间,默认十秒;
    int writeTimeout :发起请求并被目标服务器接受的超时时间。(因为有时候对方服务器可能由于某种原因而不读取你的 Request),默认十秒;

粗识okhttp

OkHttp中的细节很多,这里不过分深入,只需有个大致的结构认识即可,一些细节会在接下来的文章中具体分析。

RealCall初始化

使用OkHttpClient.newCall()创建RealCall和Transmitter类,Transmitter类可以将okhttp和网络层连接起来。

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » OkHttp源码剖析(一) 初识okhttp求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们