Skip to content

调用(Call)

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

Requests

每个HTTP请求都包含一个URL、一个method(如GETPOST)和一个header列表。 请求还可能包含一个body: 特定内容类型的数据流。

Responses

响应使用代码(如200表示成功,404表示未找到)、多个header和可选body来响应请求。

重写 Requests

当你向OkHttp提供一个HTTP请求时,你仅在高级别上描述了该请求:“用这些header信息为我获取这个URL。” 为了正确性和效率,OkHttp在传输请求之前重写你的请求。

OkHttp会添加你的原始请求中没有的一些header信息,包括Content-LengthTransfer-EncodingUser-AgentHostConnectionContent-Type。 它还将为透明响应压缩添加一个 Accept-Encoding header,除非该标头已经存在。 如果你有Cookie,OkHttp会在它们上面添加一个`Cookie‘ header。

有些请求会有缓存的响应。 当缓存的响应不是最新的时,如果更新的响应比缓存的响应新,OkHttp可以执行 有条件 Get 来下载更新的响应。 这需要添加 If-Modified-SinceIf-None-Match 之类的header。

重写 Responses

如果使用透明压缩,OkHttp将丢弃相应的响应头 Content-EncodingContent-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)。