okhttp翻译计划(一)--Calls


第一部分:Calls

Calls

一个HTTP客户端的工作是接收一个请求并产生一个响应.理论上这很简单,但是在实际中却很棘手.

Requests 请求

每一个HTTP请求都包含一个URL,一个请求方法(比如GET或者POST)和一些消息头(headers).请求还会包含一个结构体(body):特殊内容类型的数据流.(译者注:比如json)

Response 响应

请求(Requests)得到的响应(Response)会包含着一个标志码code(比如代表返回成功的200或者代表请求内容不存在的404),一个消息头(headers)和它自己可选的结构体

Rewriting Requests 重写请求

当你使用OkHttp处理一个HTTP请求时,就是在一个高水平来表述这个请求:"fetch me this URL with these headers."为了保证正确和确保效率,OkHttp会在发送请求之前重写你的请求.
OkHttp 可能会添加那些在你的原始请求里缺少的消息头(headers),包括Content-Length,Transfer-Encoding,User-Agent,Host,Content,Content-Type.为了启用明确的响应压缩,它将添加一个Accept-Encoding消息头,除非这个消息头已经存在.如果你已有Cookies,OkHttp也将把Cookies添加到消息头当中.
某些请求会有一个缓存的响应.当这个缓存的响应是过时的,如果当前的响应有更新,OkHttp会使用GET来下载一个更新的响应.这需要添加一个类似于If-Modified-SinceIf-None-Match的消息头.

Rewriting Responses 重写响应

如果使用了明确的压缩,OkHttp将会删除相应的响应消息头Content-EncodingConten-Length.这是因为他们不再适用于解压响应体. 如果一个GET请求成功了,来自网络和缓存的响应将会直接按照规范被合并.

Follow-up Requests 跟进请求

当你请求的URL被移除,网站服务器将会返回响应码比如302来指示这个新的URL.OkHttp将会跟进重定向来取回最终的响应结果.
如果响应表示需要一个授权,那么OkHttp将会在已经配置过的情况下询问Authenticator来满足这个授权.如果提供了凭据,那么OkHttp将会携带着凭据再次尝试请求.

Retrying Requests 重试请求

有时候连接会失败:或许是因为连接池失效不能连接,或许是网站服务器本身不能访问.OkHttp将在其他可用的路由上重试请求.

Calls

经过重写,重定向,跟进和重试,你简单的请求可能会生成很多请求和响应.OkHttp使用Call模型化任务,来满足你的请求过程,尽管中间有许多必须的请求和响应.一般来说不会很多!但那是令人欣慰的知道,即使你的URLs被重定向或者发生故障转移到另一个代理的ip地址,你的代码将会继续工作.
Calls将被以以下两种方式之一执行.

  • 同步执行Synchronous:你的线程直到响应返回才是可读取的.
  • 异步执行Asynchronous:你的请求队列将被安排在任意的线程,然后当响应是可读取的时,获得的回调callback在另一个线程.

Calls可以在任何线程被取消.如果Call还没有完成,这会导致它失败.当这个Calls被取消时,正在写请求体或正在读取响应体的操作将会得到IOException.

Dispach 调度

对于同步的calls,你使用自己线程并且需要对你建立多个同时的请求进行管理.太多同时的请求会浪费资源,造成延时.
对于异步的calls,DisPatcher是对于大并发请求的策略.你可以对每个网站服务器设置最大的并发数(默认是5)和总数量(默认是64)