OkHttp3基础篇:Calls

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

请求(Requests)

每一个HTTP请求中包含一个URL、方法(如GET或POST )和头部信息
请求中可能还含有一个body :特定 content type 的数据流

响应 (Response)

对应请求的响应中会有一个响应码(如 200 表示请求成功,404 表示未找​​到),响应头 headers 和响应实体 body .

重写请求 (Rewriting Requests)

当你向OkHttp提供一个HTTP请求,你相当于在描述一个 high-level 的请求:“fetch me this URL with these headers.” 为确保正确性和效率,OkHttp在发送前会重写你的要求

如果原始请求(original request)缺少头部信息:Content-LengthTransfer-EncodingUser-AgentHostConnectionContent-Type等,OkHttp可能会为其添加头部信息 。It will add an Accept-Encoding header for transparent response compression unless the header is already present.

如果你已经拿到了 cookies,OkHttp 会在头部信息中添加 Cookie .

一些请求可能会有缓存的响应:
当这个缓存的响应没有刷新,OkHttp可以做一个有条件的 GET 请求 (a conditional GET) 来下载更新的响应,但是这需要在 headers 中 添加 If-Modified-SinceIf-None-Match .

重写响应 (Rewriting Responses)

如果使用了压缩 (transparent compression ),OkHttp会删掉相应的响应头 Content-EncodingContent-Length,因为它们并不适用于解压缩响应主体 (response body)

If a conditional GET was successful,responses from the network and cache are merged as directed by the spec.

后续请求 (Follow-up Requests)

当你的请求的URL已经被删除,Web服务器将返回一个响应代码如 302 ,以表明指向的新的URL。 OkHttp将按照重定向拿到最终的响应。

If the response issues an authorization challenge, OkHttp will ask the Authenticator (if one is configured) to satisfy the challenge. If the authenticator supplies a credential, the request is retried with that credential included.
“如果响应发出一个 authorization challenge,OkHttp会要求 Authenticator (如果已配置)去满足该 challenge ,如果 authenticator 提供凭据,则重试带有该凭证的请求”

请求重试 (Retrying Requests)

有时连接会失败:要么是连接池陈旧和断开,要么是Web服务器本身无法到达。 只要有一个可用,OkHttp都会以不同的路由(route)重试请求

Calls

随着重写、重定向、跟进和重试,你发出的请求可能会产生更多的请求和响应
OkHttp使用 Call 作为任务模型来满足你的请求(无论过程中会产生多少必要的请求和响应)。通常情况下,不会很多! 但令人欣慰的是,如果您的 URLS 被重定向或者失效替换到另一个IP地址,你的代码还是会继续运行。

Calls 在以下两种方式之一执行:

  • 同步:your thread blocks until the response is readable.
  • 异步:you enqueue the request on any thread, and get called back on another thread when the response is readable.
    Calls 可以在任何线程被取消,如果这个 Call 没有完成那么就会失效! 这时写请求主体或读取响应主题的代码会发生 IOException 当其 Call 被取消

调度 (Dispatch)

  • 对于同步调用,使得你自己的线程负责管理你做了多少并发请求(simultaneous requests)。 并发连接过多浪费资源,过少导致增加等待时间。

  • 对于异步调用, Dispatcher 实现了最大并发请求策略。 您可以设置每个Web服务器最大值(默认值为5),and overall(默认为64)。

参考文章
[1] OkHttp官方wiki: Calls

你可能感兴趣的:(OkHttp3基础篇:Calls)