深入理解OkHttp3:(二)请求(Calls)详解

HTTP客户端的任务是接受您的请求并访问服务器,处理其响应。这在理论上很简单,但在实践中却很棘手。

Request:

             每个HTTP请求都包含一个URL、一个方法(比如GET或POST)和一个Header列表。请求还可以包含body:特定内容类型的数据流。

Response:

             Response以代码(像200代表成功,404代表未找到)、Header、可选的body来响应Request。

重写请求(Rewriting Requests):


当您向OkHttp提供HTTP请求时,您是在更高层次的描述请求:“为我获取这些Header的URL”。为了保证正确性和效率,OkHttp会在发送请求之前重写请求(Rewriting Requests)

OkHttp可以添加原始请求中没有的header信息,包括内容长度(Content-Length)、传输编码(Transfer-Encoding)、用户代理(User-Agent)、主机(Host)、连接(Connection)和内容类型(Content-Type)。它将为透明响应压缩添加一个Accept-Encoding头,如果头不存在的话。如果有Cookie, OkHttp将添加一个Cookie头。

有些请求将具有缓存的响应。当这个缓存的响应过时了,OkHttp可以做一个条件GET(Conditional GET)来下载一个更新的响应,当然这取决于它比缓存的响应更新。这需要添加诸如If-Modified-Sinceif-non-match之类的头信息。

重写的响应(Rewriting Responses)

如果使用透明压缩,OkHttp将删除相应的响应标头内容编码(Content-Encoding)和内容长度(Content-Length),因为它们不适用于解压缩的响应body。

如果条件GET成功,来自网络和缓存的响应将按照规范的指示进行合并。

后续的请求(Follow-up Requsts)

当请求的URL移动后,服务端将返回一个响应代码,比如302,以指示文档的新URL。OkHttp将跟随重定向来检索最终响应。

如果响应发出查问式授权(authorization challenge),OkHttp将询问身份验证器(Authenticator)(如果配置了身份验证器)以满足授权查问。如果authenticator提供了凭据,则请求在包含该凭据的情况下重试。

请求重试(Retry Requests)

有时连接失败:池连接过时且断开连接,或者无法访问web服务器本身。但如果有一个可用的路由,OkHttp将以不同的路由重试该请求。

请求(Call)

通过重写(Rewrites)、重定向(Redirects)、跟踪(Flow-ups)和重试(Retries),您的简单请求可能会产生许多请求和响应。OkHttp使用Call来建模通过许多中间请求和响应来满足您的请求的任务。通常这并不多!但令人欣慰的是,如果url被重定向,或者故障转移到另一个IP地址,您的代码将不会受影响,仍然可以继续执行。

Call的执行方式有两种:

同步(Synchronous):线程阻塞,直到响应是可读的。
异步(Asynchronous):在任何线程上排队请求,当响应可读时,在另一个线程上被调用。

可以从任何线程取消调用(Call)。如果调用还没有完成,这将导致调用失败!这时编写请求体或读取响应体的代码将遇到IOException。

调度(Dispatch)

对于同步请求,您需要携带自己的线程,并负责管理同时发出的请求数量。同一时刻太多的连接导致资源浪费;太少导致延迟高。

对于异步请求,Dispatcher为最大并发请求实现具体的策略。您可以设置每个web服务器的最大值(默认值为5),总体值为64。

本文为翻译文章:原文地址:https://github.com/square/okhttp/wiki/Calls

你可能感兴趣的:(OkHttp)