文档章节

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

k
 kim366
发布于 2016/05/13 19:08
字数 1008
阅读 5
收藏 0
点赞 2
评论 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
16
0
LNMP平台部署及应用

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

杨书凡
01/13
0
0
React Native For Android 架构初探

版权声明:本文由王少鸣原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/171 来源:腾云阁 https://www.qcloud.com/community Facebook 在2015.9.15发布...

偶素浅小浅
2016/11/09
5
0
LayoutInflater 布局渲染工具

LayoutInflater其实是一个布局渲染工具,其本质就只是一个工具,说白了LayoutInflater的作用就是根据xml布局文件构建View树,自定义View的时候经常用到,常用的做法如下: 首先通过LayoutInf...

看书的小蜗牛
01/15
0
0
你真正了解UI线程更新的几种方式吗—面试必备之深度揭秘

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

codeGoogle
2017/10/26
0
0
Lucene解析 - IndexWriter

前言 在上一篇文章我们介绍了Lucene的基本概念,在本篇文章我们将深入Lucene中最核心的类之一IndexWriter,来探索Lucene中数据写入和索引构建的整个过程。 IndexWriter 先看下Lucene中如何使...

木洛
04/17
0
0
南漂一卒/EasyWebApp

声明式 MVVM 引擎 —— EasyWebApp v4 基于 AMD 规范加载器、jQuery v3.2+ 构建,兼容 IE 9+、ECMAScript 5+、HTML 5+ 【原生态模板】 EWA 模板语法完全沿用各种 Web 前端原生技术的标准语义...

南漂一卒
2015/07/24
0
0
Dubbo 实现原理与源码解析系列 —— 精品合集

摘要: 原创出处 http://www.iocoder.cn/Dubbo/good-collection/ 「芋道源码」欢迎转载,保留摘要,谢谢! 1.【芋艿】精尽 Dubbo 原理与源码专栏 2.【老徐】RPC 专栏 3.【肥朝】Dubbo 源码解析...

芋道源码掘金Java群217878901
06/23
0
0
[连载]《C#通讯(串口和网络)框架的设计与实现》- 12.二次开发及应用

目 录 第十二章 二次开发及应用... 2 12.1 项目配制... 3 12.2 引用相关组件... 4 12.3 构建主程序... 5 12.4 设备驱动的开发... 6 12.4.1 假定通讯协议... 6 12.4.1.1 发送读实时数据命令协...

唯笑志在
2016/01/05
0
0
Android 使用LayoutInflater.Factory2创建布局

一,解析LayoutInflater运行原理 从创建一个LayoutInflater的方式我们可以知道,LayoutInflater是系统提供的单例对象 LayoutInflater layoutInflater = getLayoutInflater();↓LayoutInfla...

IamOkay
2015/04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JAVA 三种WebService 规范

JAVA 中共有三种WebService 规范,分别是JAX-WS(JAX-RPC)、JAXM&SAAJ、JAX-RS。 1. Jaxws(掌握) JAX-WS 的全称为 Java API for XML-Based Webservices ,早期的基于SOAP 的JAVA 的Web 服务...

onedotdot
8分钟前
0
0
将博客搬至CSDN

将博客搬至CSDN

xpbob
9分钟前
0
0
TensorFlow 拟合异或 one-hot方式

增加隐含层数目 之前是按照计算出的数值按照0.5分为0和1,现在是算出向量,用维度较大的作为结果 import tensorflow as tfimport numpy as np# 网络结构:2维输入 --> 2维隐藏层 --> ...

阿豪boy
11分钟前
0
0
Aidl进程间通信详细介绍

目录介绍 1.问题答疑 2.Aidl相关属性介绍 2.1 AIDL所支持的数据类型 2.2 服务端和客户端 2.3 AIDL的基本概念 3.实际开发中案例操作 3.1 aidl通信业务需求 3.2 操作步骤伪代码 3.3 服务端操作...

潇湘剑雨
26分钟前
0
0
python爬虫日志(3)下载图片

import urlliburl='https://xxx.jpg'#图片地址res=urllib.request.urlopen(url)#此函数用于对url的访问data=res.read() #字节流with open(r'D:\1.jpg',"wb") as code: c...

茫羽行
44分钟前
0
0
vue中$emit的用法

1、父组件可以使用 props 把数据传给子组件。 2、子组件可以使用 $emit 触发父组件的自定义事件。 vm.$emit( event, arg ) //触发当前实例上的事件 vm.$on( event, fn );//监听event事件后运...

JamesView
52分钟前
0
0
bash审计系统搭建

step1:使用saltstack工具bash部署>>>>>> # salt -N clienta state.sls audit step2:安装elasticsearch>>>>>> 注意: 1.不能以root用户进行启动,需要创建用户,并对解压的elasticsearch目录赋......

硅谷课堂
53分钟前
0
0
Linux sar性能分析

Linux使用sar进行性能分析 sar简介 sar命令常用格式 sar常用性能数据分析 整体CPU使用统计-u 各个CPU使用统计-P 内存使用情况统计-r 整体IO情况-b 各个IO设备情况-d 网络统计-n sar日志保存-...

易野
54分钟前
0
0
用 Python 实现打飞机,让子弹飞吧!

所用技术和软件 python 2.7 pygame 1.9.3 pyCharm 准备工作 安装好 pygame 在第一次使用 pygame 的时候,pyCharm 会自动 install pygame。 下载好使用的素材。 技术实现 初始化 pygame 首先要...

猫咪编程
今天
0
0
MySQL的行锁和表锁

简单总结一下行锁和表锁。 行锁 每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 表锁 每次操作锁住整张表。开销小,加锁快;不会出...

to_ln
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部