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。