Http基础概述
Http客户端的工作就是接收用户的请求Request和产生返回结果Response。
- Requests
每一个Http请求都包含了URL,请求方式(GET,POST),请求头,请求体。请求体中包含了特定数据类型的数据流。
- Responses
每一个响应包含了响应状态码,响应头,响应体。 -
Rewriting Requests重写请求
当使用OkHttp进行HTTP请求时,OkHttp会在传输前重写该请求。例如OkHttp会在原始请求上添加缺少的头部数据,包括Content-Length,Transfer-Encoding,User-Agent,Host,Connection和Content-Type。同时也会在没有添加Accept-Encoding头部字段时帮助我们添加这个头部字段来压缩响应结果。当获取到Cookies时,OkHttp也会使用它们添加Cookie头部字段。
有时一些请求会有缓存的响应结果,如果这些响应结果过时了,可以在请求头部字段添加If-Modified-Since和If-None-Match字段,然后OkHttp会自动下载并更新这些缓存响应结果。Rewriting Responses重写响应
当在请求头部字段中添加了压缩字段时,OkHttp会丢弃响应头部字段中的Content-Encoding和Content-Length字段,因为这些字段不适合减少响应结果的体积。
当GET或者POST请求成功时,会从网络上获取响应结果并按规范更新合并缓存Cache。Follow-up Requests后续请求
当你请求的URL不存在时,服务器会返回响应状态码302来指出Http文档的新URL。OkHttp会自动重定向到新的URL去重新检索响应结果。
如果获取的响应结果需要授权信息,如果在OkHttp中配置了某些参数,那么OkHttp会调用Authenticator接口来提供授权信息以获取响应结果。如果认证者提供了证书,那么OkHttp会重新发起请求并附带授权证书。Retrying Requests重发请求
如果网络连接失败,例如连接池过时,断线或者服务器无法到达,OkHttp会尝试使用不同的可用路由线路重新发起请求。
Calls接口
public interface Call extends Cloneable
Call是OkHttp中用来执行发起请求的接口。Call可以使用execute来发起请求,也可以使用cancel来取消请求。一个Call对象代表一个简单的request或者response,只能execute执行一次,不能执行两次。
OkHttp中有了上述的重写,重定向,后续请求和重发请求等特性,用户就可以简单的发起请求和获取响应了。OkHttp使用Call对象来作为请求的模型,Calls可以使用两种不同的方式来执行:
- Synchronous同步
发起请求的线程会阻塞直到读取到响应内容
- Asynchronous异步
可以将请求添加到任何一个线程队列中,然后当响应可读取信息时,可以在另一个线程中获取回调响应 -
当Call请求还没完成时,可以在任何一个线程中取消Calls请求,但是要注意在输入request请求体或者读取response响应体时,如果取消了Call请求,会发生IOException异常。
Dispatch调度
对于同步的请求Call,用户需要负责管理发起同步请求的线程,需要注意发起同步请求的数量,太多的同步请求会造成资源浪费,太少则会导致延迟。
对于异步的请求Call,Dispatcher调度器会按照策略来执行最大数量的同步请求。你可以设置自己的策略,例如per-webserver的最大数量(默认是5),或者全部(默认64)。