-
Notifications
You must be signed in to change notification settings - Fork 0
Calls
后面的Connections一文有解释什么是url、route和address,这里先知道有这么个概念就好。
HTTP客户端的工作就是发送请求、接受响应,但是这个看上去很简单的工作实际很复杂。
每个HTTP请求都包含一个URL、一个方法描述(类似GET or POST)、一个请求头列表。请求还可能包含一个请求体(body):一个指定内容类型数据流。
HTTP响应通过一个状态码(比如200表示成功,404表示请求资源不存在)用来响应HTTP请求,HTTP响应还包括响应头列表(headers)、响应体(body)
当你通过OkHttp发送一个HTTP请求时,你的描述可能非常简单,像:"用某些请求头向某个URL发送请求并获得数据"。为了正确高效的获取结果,OkHttp会在发送请求前对请求进行重写。
OkHttp可能会向请求头列表中增加一些缺失的,如Content-Length、Transfer-Encoding、User-Agent、Host、Connection和 Content-Type。如果没有设置Accept-Encoding头,OkHttp会给请求增加Accept-Encoding头以获得
压缩后的响应。如果之前发送的HTTP请求的响应中设置了Cookie,则OkHttp也会在请求头中增加Cookie头。
某些请求可能存在本缓存了的响应。当缓存的响应过期时,OkHttp会执行一个 满足某些条件的GET 以获取比当前缓存的响应更新的缓存。更新缓存的触发条件是如果在请求头列表中设置了 If-Modified-Since 和 If-None-Match
如果启用了压缩功能,OkHttp会丢弃响应头列表中的 Content-Encoding 和 Content-Length ,因为他们并不适用于解压缩后的响应体。
如果条件触发的GET响应成功,OkHttp会根据规范合并网络获取的响应和缓存中的响应。
如果你请求的URL已经更换了,对应url的web服务会返回一个类似 302 的状态码以指向新的URL。OkHttp自己会重定向一直到获取到最终的响应。
如果返回中带了一个授权询问(authorization challenge没搞懂是啥),OkHttp会询问Authenticator(如果配置了的话)以应答这次询问。如果authenticator提供了证书,则在重试请求中也会携带此证书。
有时连接会失败,如:连接池的中的对应连接过期并断开了,或者无法访问到服务了。OkHttp会尝试使用其他route连接并发送请求。
OkHttp使用 Call 这个模型以对应每个请求任务。因为OkHttp会自动重写、重定向、追踪和重试,一个简单的请求可能会衍生出很多请求和响应,但是这些请求和响应是必要的。。通常来说请求和响应不会特别多,但你还是有必要知道在重定向URL或者在切换到备用IP时,你的代码会继续执行。
用两种方式执行Call
- 同步执行: 当前线程会被阻塞直到响应可读。
- 异步执行: 将请求放入某个线程队列中,当请求可读时在另个线程中回调 called back
在任何线程中都可以取消Call。无法取消一个已经请求完毕的Call。如果调用Call的取消方法的同时,有其他代码在写请求或者读响应,这些代码会抛出一个IOException异常。
对于同步的Call,开发者需要自己管理对应Call的线程以及Call的并发。太多并发会浪费资源但是太少的并发会增加延迟。
对于异步的Call,Dispatcher实现了最大并发请求策略。开发者可以设置对应每个服务的最大并发数(默认是5)和总最大并发数(默认是64)。
使用OkHttp
Developing OkHttp