Android源码分析-OkHttp-1-来自官网的描述

279 阅读3分钟

OkHttp

OkHttp是当下最流行的应用网络请求框架。 OkHttp是高效的HTTP客户端:

  • Http/2允许来自同一主机的所有请求共享一个Socket.
  • 连接池减少了请求时间(如果Http/2不可用)
  • GZIP压缩,减少下载内容,节省流量
  • 请求缓存,节省服务器压力

Sample 1 Get请求

OkHttpClient client = new OkHttpClient();
Request request = new RequestBuilder().url(url).build();
try(Response response = client.newCall(request).execute()){
    String res = response.body.string();
}

Sample 2 Post请求

public static final MediaType JSON =   MediaType.get("application/json;charset=utf-8");
OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.ceate(JSON, json);
Request request = new Request.Builder().url(url).post(body).build();
try(Response response = client.newCall(request).execute()){
    String res = response.body.string();
}

要求

系统环境:Android5.0+(api21+) 依赖环境:

  • Java8+
  • Okio:高性能IO
  • Kotlin:Okio和OkHttp的源码均已重构为Kotlin编写

OkHttp版本要尽可能的保持为最新. OkHttp使用平台的内置TLS实现,在Java平台上OkHttp支持Conscrypt,Conscrypt是一个Java安全提供者,它实现了Java密码扩展和Java安全套接字扩展的一部分。

Calls

HTTP客户端的工作是接受您的请求并生成其响应。这在理论上很简单,但在实践中却很棘手。

Requests 请求

每个HTTP请求包含URL,请求方法(GET/POST/PUT...)以及一些头部信息,也可以再包含一个请求体:特定内容类型的数据流。

Responses 响应

响应一般包含一个响应码(2xx成功),头部以及相应体。

重写请求

当您向OkHttp提供一个HTTP请求时,您是在高级描述该请求:“用这些头获取这个URL。 为了确保正确性和效率,OkHttp会在传输请求之前重写请求。 OkHttp可以添加原始请求中不存在的头,包括内容长度、传输编码、用户代理、主机、连接和内容类型。它将为透明响应压缩添加一个接受编码头,除非该头已经存在。如果您有Cookie,OkHttp将添加一个Cookie头。 某些请求将具有缓存响应。当这个缓存的响应不及时时,如果更新的响应比缓存的响应新,OkHttp可以执行条件GET来下载更新的响应。这需要像If Modified Since和If-None-Match这样的标题才能添加。

重写响应

如果使用透明压缩,OkHttp将删除相应的响应头Content-Encoding(内容编码)和Content-Length(内容长度),因为它们不适用于解压缩的响应体。 如果条件获取成功,则按照规范的指示合并来自网络和缓存的响应。

重定向、跟踪请求

当您请求的URL已经移动时,web服务器将返回一个类似302的响应代码来指示文档的新URL。OkHttp将遵循重定向来检索最终响应。

如果响应发出授权质询,OkHttp将要求身份验证器(如果已配置)满足质询。如果验证器提供凭据,则在包含该凭据的情况下重试请求。

重试策略Retrying Requests

有时连接失败:连接池过期并且已经断开连接,web服务器已经无法访问,如果有可以访问的其他陆游,OkHttp会尝试重新提交这些失败的请求。

Calls

通过重写、重定向、跟踪和重试,您的简单请求可能会产生许多请求和响应。OkHttp使用Call来模拟通过许多中间请求和响应来满足您的请求的任务。一般来说这不多!但是,如果您的url被重定向或故障转移到另一个IP地址,那么您的代码将继续工作。

请求有两种方式执行:同步和异步

可以在任意线程取消尚未执行的请求,如果正在执行,正在写入请求体或读取响应体的代码将遭受IOException。

线程调度

同步请求,请求运行在请求线程 异步请求,由调度器负责控制并发

连接

使用者只提供了一个URL用于HTTP请求,OkHttp中定义了三种数据类型来连接WebServer。

URLs
Addresses
Routes