文档章节

OkHtto完全解析(二)构建和调用

k
 kim366
发布于 2016/05/13 19:08
字数 1008
阅读 5
收藏 0

要求基于Java 7构建和运行,运行时需兼容Java 6确保 Android平台和旧版本JVM的稳定性。

2.1 通过Maven进行桌面测试

通过Maven在桌面上运行OkHttp测试程序。使用Jetty-ALPN在桌面上运行HTTP/2和SPDY的测试程序。

mvn clean test

2.2 不使用Maven进行桌面测试

2.3 设备测试



1. 调用 Calls

HTTP客户端的工作是接受你的请求,并产生响应。这一点理论上很简单,但是实际上很棘手。

3.1 请求

每个HTTP请求包含一个URL,一个方法(GET或者POST,一个头列表。请求也可能包含一个请求体,或者一个特定类型的数据流。

3.2 响应

HTTP通过响应码202或者404响应请求,还包含头部和自身可选的响应体。

3.3 重写请求

当给OkHttp提供一个HTTP请求时,等于是给了OkHttp一个获取数据的命令。为了保证高效性和正确性,OkHttp会在发送之前重写你的请求。

OkHttp允许添加原始请求中不包含的头部,包括Content-Length, Transfer-Encoding,User-Agent,Host,ConnectionContent-Type。也会在Accept-Encoding默认缺失的情况下,添加一个Accept-Encoding头部使响应压缩透明化。如果已经存在cookie,则OkHttp也会再添加Cookie头部。

有些请求可能存在缓存响应。当缓存响应没有更新时,如果缓存的内容有更新,则OkHttp可以执行一个条件性的GET操作下载一个更新响应。这个请求可能包含一个If-Modified-SinceIf-None-Match头部。

   [源码分析:4.1]

3.4 重写响应

如果使用透明化压缩,则OkHttp会放弃相应的响应头部Content-Type Content-Length, 因为这两个头部不适用于非解压的响应头部。如果条件性GET请求成功,则来自网络和缓存的响应会根据规格直接合并。

3.5 增强请求

如果你请求的URL被移除,web服务器会返回一个类似302的响应码表明文档的新URLOkHttp会跟进这个重定向的地址,并获取最终的响应。如果响应发出一个授权问题,OkHttp会询问认证者(如果有配置的话)是否满足授权要求。如果认证者提供了一个证书,那么请求会包含该证书进行重试。

3.6 重试请求

在下列情况下,连接会失败:线程池陈旧或者断开,web浏览器自身无法到达。这时,OkHttp会获取提供的不同线路进行重试。

3.7 调用

通过重写,重定向,请求增强和重试,你的简单请求可能产生很多个请求和响应。OkHttp使用call来模拟满足你请求的任务,不论需要多少个中间请求和响应。一般情况下不需要很多中间请求和响应,不过,在你的URLs不断重定向或者指向可选IP地址失败的时候,就会这样。

调用会以下列两种方式执行:

     同步执行:线程阻塞,知道响应可读取。

     异步进行:入队请求到任意一个线程,然后在另一个线程中,在响应可读取时获取回调。

可以从任意线程中取消调用。如果调用还没有完成,则取消操作会失败。如果正在写入请求体或者正在读取响应体,则取消操作会触发IOException

3.8 分发

对于同步调用,你需要自己管理创建的同步请求。同步请求太多会浪费资源,太少会导致延迟。

对于异步调用,分发器会实现满足最大数量同步请求的代理。你也可以为每个web服务器设置最大值(默认是5个)或者为所有web服务器设置最大总和(默认是64个)。

 

 


本文转载自:http://blog.csdn.net/oyangyujun/article/details/50039215

k
粉丝 1
博文 129
码字总数 0
作品 0
朝阳
私信 提问
Android 一个改善的okHttp封装库

一、概述 之前写了篇Android OkHttp完全解析 是时候来了解OkHttp了,其实主要是作为okhttp的普及文章,当然里面也简单封装了工具类,没想到关注和使用的人还挺多的,由于这股热情,该工具类中...

百世经纶一页书梵天
2016/12/02
29
0
我眼中的 Nginx(六):深入 Nginx/Openresty 服务里的 DNS 解析

张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护。Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技术的研究;曾为 ngxlua...

又拍云
04/29
0
0
MyBatis实战(二)-一级缓存原理解析

1 概论 每当我们使用MyBatis开启一次和数据库的会话,MyBatis会创建出一个SqlSession对象表示一次数据库会话 在对数据库的一次会话中,我们有可能会反复地执行完全相同的查询语句,如果不采取...

芥末无疆sss
2018/10/06
0
0
你真正了解UI线程更新的几种方式吗—面试必备之深度揭秘

你真正了解UI线程更新的几种方式吗——面试必备之UI刷新大解密 我们都知道一般面试的时候都会问道Handler的运行机制。有些时候面试官不会直接问道。但是如果问道UI线程更新的方式有哪几种,你...

codeGoogle
2017/10/26
0
0
LNMP平台部署及应用

LAMP平台应该是目前应用最为广泛的网站服务器架构,但随着Nginx在企业中的使用越来越多,LNMP(或LEMP)架构也受到越来越多Linux系统工程师的青睐,其中"E"来自于Nginx的发音[engine x] 构建...

杨书凡
2018/01/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部