文档章节

Httpclient小结

jhonephone
 jhonephone
发布于 2014/10/11 18:02
字数 1538
阅读 76
收藏 0
点赞 0
评论 0

1. HttpClient最主要的函数是执行HTTP方法,包括HTTP请求和响应。用户向HttpClient提供一个request对象,由HttpClient负责将请求发送给目标服务器,随后返回一个response对象或者扔出异常。

2. HTTP请求行包含一个方法名、请求URI和HTTP协议版本。HttpClient支持HTTP/1.1定义的所有方法:GET、HEAD、POST、PUT、DELETE、TRACE和OPTIONS,分别对应HttpGet、HttpHead、HttpPost、HttpPut、HttpDelete、HttpTrace、HttpOptions类。HttpClient提供URIBuilder构建URI。

3. HTTP响应是服务器返回给客户端的一条消息,消息第一行包括协议版本数字状态码及其相应的文本。Http消息可以包含几个头,描述消息的特性,例如内容长度、内容类型、设置cookie等。HttpClient提供方法获取、添加、移除和枚举HTTP头。HTTP消息也可以携带HTTP实体。HTTP提供两种实体封装请求的方法,PUT和POST。response通常都包含HTTP实体,对HEAD方法和204 No Content、304 Not Modified、205 Reset Content响应除外。HttpClient根据实体内容的来源,区分为流式的、自我包含的、封装的。

自我包含的实体ByteArrayEntity和StringEntity是可重用的。HttpEntity的getContentType、getContentLength和getContentEncoding方法读取实体的元信息。

关闭HttpEntity.getContent对应的输入流和关闭HttpResponse.close的区别在于会否立即切断HTTP连接。在处理流式实体时,EntityUtils的consume方法确保内容实体被完全消耗,对应的流也被关闭。在只需要利用实体中的少量内容的情况下,消耗整个实体的代价较大,此时可以直接关闭HttpResponse,连接之后不能重用,但是所有占用的资源会被正确的释放。通过BufferedHttpEntity封装,会将HttpEntity的内容读入内存,以被重用。

HttpClient提供StringEntity、ByteArrayEntity、InputStreamEntity、FileEntity封装相应对象。UrlEncodedFormEntity将List<NameValuePair>封装。

ResponseHandler接口提供handleResponse(HttpResponse response)方法,处理消息。

多个逻辑相关的请求可以构成一个逻辑会话,如果在连续的请求中使用相同的上下文背景。HTTP context类似于Map<String, Object>,是任意键值对的集合。HttpConnection代表同目标机器的连接实例,HttpHost代表目标主机,HttpRoute代表完整的连接路径,HttpRequest代表实际的HTTP请求,HttpResponse是真实的HTTP响应,Boolean表征请求是否完全发送,RequestConfig是真实的请求配置,List<URL>代表所有重定向的位置。

HTTP协议时面向请求应答的,不支持交易操作。

idempotent方法:N个相同的请求的响应相同。HttpClient中GET和HEAD是幂等的,POST和PUT不是。

HttpRequestRetryHandler接口定义异常恢复机制。

1. HttpClient支持3种不同的HTTP认证方式:Basic, Digest, NTLM. HttpClient几乎透明的处理服务器方的认证,开发者唯一需要做的就是提供登陆的凭证。这些凭证被保存在HttpState实例中,可以setCredentials(AuthScope authscope, Credentials cred)和getCredentials(AuthScope authscope)方法设置和获取凭证。内置在HttpClient中的自动认证可以通过方法HttpMethod.setAuthentification(boolean doAuthentification)取消。该设置仅仅影响所在的HttpMethod实例。Preemptive认证可以通过client.getParams().setAuthentificationPreemptive(true)设置开启。优先认证也需要为连接的目标服务器或者代理,设置默认的凭证,没有设置凭证将导致优先认证失效。Credentials defaultcreds = new UsernamePasswordCredentials("username", "password") client.getState().setCredentials(new AuthScope("myhost", 80, AuthScope.ANY_REALM), defaultcreds).  在和不可信的服务器认证时,应该尽可能缩小认证的范围,指定host, realm。Basic认证模式是最原始也是兼容性最强的HTTP认证模式,然而却也是最不安全的,它直接就将username和password不经过加密发送给服务器。Digest模式会对密码进行加密。

2. Options请求获取通讯可选项信息,GET返回URL所定位的任何资源,HEAD和GET相同只是返回的响应中不包含任何内容实体,可以用于获取文档的元信息,而不传送文档本身的内容,POST用于向服务器请求将请求实体中的内容作为URL的一部分

3. 有一些重定向类型HttpClient不能够自动处理,要么是因为要求用户交互,要么是返回的状态码不在HttpClient处理的范围之内,或者是内部的限制。当前HttpClient不能够自动处理包含内容实体的重定向,例如POST和PUT。


1. HTTP状态管理

HTTP cookie就是HTTP代理和服务器相互交换保持会话的令牌或信息包。

兼容Netscape draft却不兼容官方标准的cookie被认为是版本0.和标准兼容的cookie被认为是版本1. HttpClient可能会根据版本的不同处理cookie。可以通过BasicClientCookie创建不同版本的cookie。

CookieSpec接口表示cookie的标准。解析Set-Cookie以及可选的Set-Cookie2头的规则;确认解析的Cookie;为一个给定的host,port,原始路径格式化cookie。HttpClient提供了多个cookie标准选项:Netscape draft, Standard, Browser compatibility, Best match, Ignore cookies.

HttpClient可以结合持久化的CookieStore接口。BasicCookieStore是一个基于ArrayList的简单的实现。当容器对象被GC收集掉后,保存在BasicClientCookie对象中的cookie将丢失。

在HTTP请求执行时,HttpClient将添加下面状态管理相关的对象:Lookup代表cookie标准注册表,CookieSpec代表cookie标准,CookieOrigin代表真实服务器的真实细节,CookieStore。

2. HTTP连接管理

建立端到端的连接过程比较复杂,可能包括多次packet的交换,也比较耗时。建立连接时的握手就是一个很大的开销,特别是对小的HTTP信息包。如果打开的连接能够被重用,来执行多个请求效率将大大提高。保持连接alive状态也成为连接持久化。

HttpClient区别路由方式为:plain,tunneled,layered。使用多个中间代理,来建立到目标机器的连接也成为proxy chaining。

© 著作权归作者所有

共有 人打赏支持
jhonephone
粉丝 3
博文 19
码字总数 24506
作品 0
合肥
高级程序员
聊聊spring cloud gateway的NettyConfiguration

序 本文主要研究下spring cloud gateway的NettyConfiguration NettyConfiguration spring cloud gateway使用的是reactor的httpclient,其通过nettyClientOptions这个bean来进行构造options,......

go4it ⋅ 06/03 ⋅ 0

关于HttpClient重试策略的研究

原文出处:kingszelda 一、背景 由于工作上的业务本人经常与第三方系统交互,所以经常会使用HttpClient与第三方进行通信。对于交易类的接口,订单状态是至关重要的。 这就牵扯到一系列问题:...

kingszelda ⋅ 04/25 ⋅ 0

聊聊spring cloud的PreserveHostHeaderGatewayFilter

序 本文主要研究下spring cloud gateway的PreserveHostHeaderGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gatew......

go4it ⋅ 06/14 ⋅ 0

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 今天 ⋅ 0

聊聊spring cloud gateway的streaming-media-types属性

序 本文主要研究下spring cloud gateway的streaming-media-types属性 配置 配置说明 GatewayProperties spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gatew......

go4it ⋅ 06/07 ⋅ 0

大家都用什么工具发起http请求的呢?

我以前喜欢用apache的 httpClient ,公司用jersey。听经理说jersey的性能好,是真的吗?我在网上并没有搜到相关的性能比较,java9也带了一个httpClient,不知性能对比起来又如何?...

暗中观察 ⋅ 04/22 ⋅ 0

聊聊spring cloud gateway的RemoveHopByHopHeadersFilter

序 本文主要研究一下spring cloud gateway的RemoveHopByHopHeadersFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC1-sources.jar!/org/springframework/cloud/gateway......

go4it ⋅ 05/30 ⋅ 0

使用httpClient 调起https url接口

遇到的问题* 1、ssl证书信任,解决方式信任所有证书 2、生成请求体调用httpPost.setEntity()时输出的参数格式有误,有多种Entity可以选择(常用 StringEntity、UrlEncodedFormEntity、FileE...

梦魂清风 ⋅ 05/10 ⋅ 0

Httpclient报Timeout waiting for connection from pool 异常

下面这段代码在定时一分钟的任务里面执行: public String remoteJsonUTF8(String url) { HttpGet get = null; CloseableHttpResponse response = null; String json = null; CloseableHttpCl......

小小的小小snake ⋅ 05/17 ⋅ 0

聊聊spring cloud gateway的LoadBalancerClientFilter

序 本文主要研究一下spring cloud gateway的LoadBalancerClientFilter GatewayLoadBalancerClientAutoConfiguration spring-cloud-gateway-core-2.0.0.RELEASE-sources.jar!/org/springfram......

go4it ⋅ 06/20 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Python爬虫,抓取淘宝商品评论内容

作为一个资深吃货,网购各种零食是很频繁的,但是能否在浩瀚的商品库中找到合适的东西,就只能参考评论了!今天给大家分享用python做个抓取淘宝商品评论的小爬虫! 思路 我们就拿“德州扒鸡”...

python玩家 ⋅ 4分钟前 ⋅ 0

MySQL 内核深度优化

MYSQL数据库适用场景广泛,相较于Oracle、DB2性价比更高,Web网站、日志系统、数据仓库等场景都有MYSQL用武之地,但是也存在对于事务性支持不太好(MySQL 5.5版本开始默认引擎才是InnoDB事务...

java高级架构牛人 ⋅ 26分钟前 ⋅ 0

用户登录信息-钉子效果(基于jquery2.0)

本js效果使用jquery2.0,清晰的分解用户登录信息的(钉子效果),该效果直接用在作者网站(www.phpkhbd.com)上。 里面的难点有:定时器,延时。 大致效果如下: 一开始: 鼠标放上去的时候:...

宁哥实战课堂 ⋅ 28分钟前 ⋅ 0

解决yum安装报错Protected multilib versions

使用yum安装报错Protected multilib versions原因是因为多个库不能共存,不过更新的话也并不行,但是可以在安装命令后面加上如下一段命令: --setopt=protected_multilib=false 案例: 比如需...

北岩 ⋅ 39分钟前 ⋅ 0

为什么要学习Typescript???

简单来说 目前的typescript就是未来的javascript 为什么?? 这要从ECMA-262标准的第4版说起 对了 我们说的ES5 其实是ECMAScript3.1这个替代性建议被扶正了而已... 那么 第4版标准是什么? 看看...

hang1989 ⋅ 43分钟前 ⋅ 0

linux安装ipfs

一、下载ipfs # cd /usr/local/ipfs/ # wget https://dist.ipfs.io/go-ipfs/v0.4.15/go-ipfs_v0.4.15_linux-amd64.tar.gz # tar -zxvf go-ipfs_v0.4.15_linux-amd64.tar.gz 二、安装ipfs # ......

八戒八戒八戒 ⋅ 49分钟前 ⋅ 0

jvm程序执行慢诊断手册

生产环境最多的几种事故之一就是程序执行慢,如果是web服务的话,表现就是响应时间长。本文分享,从业多年形成的排查守则。 诊断步骤 系统资源查看 首先是系统资源查看,而且必须是在第一步。...

xpbob ⋅ 49分钟前 ⋅ 0

YII2 advanced 高级版本项目搭建-添加API应用以及多应用

一、YII安裝 安裝yii可以用composer安裝,也可以在yii中文社区下载归档文件安装 composer安装就不介绍了,因为要安装composer,比较麻烦,当然安装了composer是最好的,以后安装yii的插件要用...

botkenni ⋅ 50分钟前 ⋅ 0

在jdk1.8的环境下模拟永久代内存溢出

相信不少小伙伴在看深入理解Java虚拟机的时候,作者给我们举例一个demo来发生PermGen space 1、通过List不断添加String.intern(); 2、通过设置对应的-XX:PermSize与-XX:MaxPermSize(更快看到...

虾几把写 ⋅ 今天 ⋅ 0

开发OpenDaylight组件的完整流程

在前面介绍学习了OpenDaylight的几个重要模块后,这里再来介绍下完整开发一个模块的过程。 OSGI的bundles提供被其他OSGI组件调用的服务。这个教程中展示的是Data Packet Service去解析数据包...

wangxuwei ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部