调用(Call)¶
HTTP客户端的工作是接受你的请求并生成其响应。 这在理论上很简单,但在实践中却变得棘手。
Requests¶
每个HTTP请求都包含一个URL、一个method(如GET
或POST
)和一个header列表。 请求还可能包含一个body: 特定内容类型的数据流。
Responses¶
响应使用代码(如200表示成功,404表示未找到)、多个header和可选body来响应请求。
重写 Requests¶
当你向OkHttp提供一个HTTP请求时,你仅在高级别上描述了该请求:“用这些header信息为我获取这个URL。” 为了正确性和效率,OkHttp在传输请求之前重写你的请求。
OkHttp会添加你的原始请求中没有的一些header信息,包括Content-Length
、Transfer-Encoding
、User-Agent
、Host
、Connection
和Content-Type
。 它还将为透明响应压缩添加一个 Accept-Encoding
header,除非该标头已经存在。 如果你有Cookie,OkHttp会在它们上面添加一个`Cookie‘ header。
有些请求会有缓存的响应。 当缓存的响应不是最新的时,如果更新的响应比缓存的响应新,OkHttp可以执行 有条件 Get 来下载更新的响应。 这需要添加 If-Modified-Since
和 If-None-Match
之类的header。
重写 Responses¶
如果使用透明压缩,OkHttp将丢弃相应的响应头 Content-Encoding
和 Content-Length
,因为它们不适用于解压缩的响应Body。
如果条件GET成功,则按照规范的指示合并来自网络和缓存的响应。
当你请求的URL执行后,web服务器将返回一个响应代码,如 302
,以指示文档的新URL。 OkHttp将跟随重定向来检索最终响应。
如果响应发出授权质询,则OkHttp将请求Authenticator
(如果已配置)满足该质询。 如果身份验证器提供了凭据,则会在包含该凭据的情况下重试该请求。
重试 Requests¶
有时连接会失败: 池连接已过时并断开连接,或者无法访问web服务器本身。 OkHttp将使用不同的路由重试该请求(如果可用的话)。
Calls¶
通过重写,重定向,follow-up和重试,你的简单请求可能会产生许多请求和响应。 OkHttp使用Call
来模拟通过需要多少中间请求和响应来满足你的请求的任务。 通常这不多! 但令人欣慰的是,如果URL被重定向或故障转移到备用IP地址,你的代码将继续工作。
Call以两种方式之一执行:
- 同步: 你的线程阻塞,直到响应可读。
- 异步: 你可以在任何线程上将请求排队,并在响应可读时在另一个线程上获取回调。
可以从任何线程取消调用。 如果尚未完成,这将使调用失败! 正在写入请求body或读取响应body的代码在其调用被取消时会遇到IOException
异常。
Dispatch¶
对于同步调用,你可以自带线程,并负责管理你同时发出的请求数。 同时连接太多会浪费资源,太少会产生延迟。
对于异步调用,Dispatcher
可用于实现最大同时请求的策略。 你可以设置每个web服务器的最大值 (默认为5) 和全部最大值 (默认为64)。