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