文档章节

Httpclient小结

jhonephone
 jhonephone
发布于 2014/10/11 18:02
字数 1538
阅读 78
收藏 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
粉丝 4
博文 19
码字总数 24506
作品 0
合肥
高级程序员
聊聊spring cloud gateway的NettyConfiguration

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

go4it
06/03
0
0
Android 浅谈HttpClient工具类

在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务。你可以把HttpClient想象成一个浏览器,通过它的...

Jonson
2013/07/25
0
3
Java HTTP 组件库选型看这篇就够了

原文出处:行思錄 Java HTTP 组件库选型看这篇就够了 最近项目需要使用 Java 重度调用 HTTP API 接口,于是想着封装一个团队公用的 HTTP client lib. 这个库需要支持以下特性: 连接池管理,...

行思錄
09/25
0
0
HttpClient4.x:Get和Post提交数据

HttpClient是一款用Java写的非常好用的基于Http协议的客户端编程工具包。具体举例来讲,用它可以模拟form表单提交数据动作,可以模拟访问网页动作及得到网页源码内容等等,这两点或许是我们在...

liangtee
2012/12/02
0
0
.NET Core 2.1中的HttpClientFactory最佳实践

ASP.NET Core 2.1中出现一个新的HttpClientFactory功能, 它有助于解决开发人员在使用HttpClient实例从其应用程序发出外部Web请求时可能遇到的一些常见问题。 介绍 在.NETCore平台的2.1新增了...

dotNET跨平台
08/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
35分钟前
1
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
2
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
25
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
2
0
emoji

前言:随着iOS系统版本的升级,对原生emoji表情的支持也越来越丰富。emoji表情是unicode码中为表情符号设计的一组编码,当然,还有独立于unicode的另一套编码SBUnicode,在OS系统中,这两种编...

HeroHY
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部