《okhttp文档翻译第一篇:官方介绍》

本文基于okhttp的wiki翻译而来,根据自己的理解对文档进行了通俗易懂的翻译,如有错误还请指正。

1、okhttp的相关概念

1.1、Calls

Requests(请求)

每个http的请求包含一个url、一个method(请求方法,例如get、post)、请求头部(headers),可能也包含一个请求体(body:具有明确数据类型的数据流)。

Responses(响应)

对于某个请求的响应往往包含一个响应码(code,如成功返回200,为找到资源返回404)、响应头部(headers)、和一个响应体(body)。

Rewriting Requests(重写请求)

为了保证一个http请求的正确性和高效性,okhttp往往在发起网络请求之前会重写你的请求信息。

有些请求头信息如果在你提交的原始请求里面不存在,okhttp会帮你去添加这些请求头。这些请求头包含Content-Length、Transfer-Encoding、User-Agent、Host、Connection和Content-Type。如果你没有添加Accept-Encoding请求头的话,okhttp会添加一个Accept-Encoding请求头来保证对响应(response)进行一个透明压缩。如果你有使用cookies,okhttp同样会添加一个cookie请求头。

一些网络请求可能会通过缓存来获取数据。当这个缓存数据过期了的话,okhttp会去服务端获取相应信息并更新缓存,为了使用缓存,你需要添加If-Modified-Since和If-None-Match请求头。

Rewriting Responses(重写响应)

如果响应使用了透明压缩,okhttp会丢弃原有的Content-Encoding和Content-Length请求头,因为他们和解压后的请求体是不匹配的。

如果get条件请求成功了,网络响应和缓存响应将按照一定规格进行合并。

Follow-up Requests(请求追踪)

当你请求的url转移到其他地方,请求服务会返回一个302的状态码并指示一个新的url地址,okhttp会对这个url进行重定向直到获取到最终的请求地址。

如果服务器需要客户端进行一个授权验证,okhttp将寻求Authenticator(如果设置了的话)来提交授权验证,如果Authenticator提供了授权凭证,okhttp将使用该凭证再次发起请求。

Retrying Requests(失败重连)

有些时候网络请求可能会失败,这可能是因为连接池地址已经失效导致不能连接,又或者是服务器异常无法访问。这种情况下okhttp将会试图通过其他可用的router(路由)来重新发起连接请求。

Calls

由于okhttp的重写(reWriting)、追踪(follow up)、重定向(redirects)和重连(retries)机制,一个简单的网络请求可能会产生多个请求和响应。即使中间包含多个必要的请求和相应,okhttp都能通过call来模拟任务从而满足你发起的网络请求。通常这不是很多!但是,如果您的URL被重定向或者故障转移到备用IP地址,您的代码将继续有效,这一点令人欣慰。

call执行的两种方式:
同步执行(Synchronous):在获取到响应之前会阻塞当前线程。
异步执行(Asynchronous):在某个线程中执行请求,在另一个线程获取返回值(call back)。

calls可以被取消(canceled),当取消一个未完成的请求时,请求会失败并且抛出一个IoException。

Dispatcher

对于同步请求,你需要自己创建线程来管理多个并发的请求,并发请求数太多会造成资源的浪费,太少又会造成相应延迟。

对于异步请求,Dispatcher有一个最大同时请求数的策略。您可以设置每个网络服务器的最大值(默认值为5)和总体(默认值为64)。

1.2、Connections

即使你仅仅提供了一个url地址,okhttp计划使用三种类型来连接到你的服务器:Url、Address、Route。

URLs

URLs(如https://github.com/square/okhttp)是http和Internet的基础。除了为web上所有资源提供分散的命名之外,他还能指定如何获取web上的资源。

URLs是一个抽象的概念(abstract):

  • 它指定了一个call是明文的http请求还是加密的https请求,但它并没有指定通过哪种加密算法进行数据加密,没有指定该怎样去证实一个正数的有效性(HostNameVerifier),也没有指定那些证书应该被信任(SSLSocketFactory)。
  • 它没有指定是否应该使用特定的代理服务器或者如何使用该代理服务器进行身份验证。

同时URLs也是一个实在的概念:每个URL都有确定路径(如/square/okhttp),和请求参数(如?q=sharks&lang=en)。每个服务器拥有多个URLs。

Address

Address指定了一个服务器(如github.com)和连接到这个服务器所需要的所有静态配置:端口号、https的一些设置和首选的网络协议(如http2.0或者spdy协议)。

具有相同地址(Address)的URLs通常会共用同一个TCP的socket连接。共用同一个socket连接有非常不错的表现力:低延迟、高吞吐量和低耗电。okhttp通过连接池来自动重用http1.x,http2.0和SPDY的连接。

在OKhttp中,地址的设置一部分来源于URL(scheme、hostname、port),一部分来源于OKhttpClient。

Routes

Routes提供实际连接到服务器所需的动态信息。它提供一个明确的IP地址(由DNS查询找到),确切的代理服务器(如果ProxySelector是有用的话),以及要协商的TSL版本(针对https连接)。

对于单一的地址可能有许多的路由,例如一个拥有多个数据中心的服务器可能会产生多个IP地址在他的DNS响应当中。

Connections

当你使用okhttp去请求一个url,OKhttp为我们做了以下事情:
1、使用这个url和已配置好的okhttpClient去创建一个地址(Address),这个地址声明了我们将如何连接到服务器。
2、通过这个地址(Address)在连接池(connection pool)中尝试获得一个连接。
3、如果在连接池中没有找到一个有效的连接,okhttp将尝试使用路由(route)。这意味着需要发起一个DNS请求来获取服务器的IP地址,接着选择一个TSL版本和代理服务器。
4、如果是一个新的路由,连接的建立要么通过一个直接的socket连接和一个TSL通道,要么通过直接使用一个TSL连接。必要时需要三次握手。
5、发送request请求然后获取reponse响应。

如果当前连接遇到了问题,okhttp会选择另外一个路由再次尝试。这使得当一个服务器地址是无法访问的时候,okhttp也能够恢复连接。同样,当连接池过期或者试图使用一个不支持的TSL版本,okhttp仍然能够恢复有效的连接。

一旦获取到了服务器响应(response),当前连接将被存放到连接池中以便再次请求的时候可以重用它。当连接在一段时间没有使用时将会移除连接池。

你可能感兴趣的:(《okhttp文档翻译第一篇:官方介绍》)