文档章节

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
粉丝 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
0
Android 浅谈HttpClient工具类

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

Jonson
2013/07/25
0
3
HttpClient4.x:Get和Post提交数据

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

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

.NET Core 2.1中的HttpClientFactory最佳实践 ASP.NET Core 2.1中出现一个新的HttpClientFactory功能, 它有助于解决开发人员在使用HttpClient实例从其应用程序发出外部Web请求时可能遇到的一...

Chaunce
前天
0
0
使用jetty 自带的http client!

一般情况下我们需要使用HttpClient时可供选择的技术有: 1、HttpURLConnection 2、Apache HttpClient 其他的除了写Socket 我都没有用过了。 偶然的机会发现Jetty 里面也自带了一个HttpClien...

一堆BUG
2012/02/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

[雪峰磁针石博客]python3快速入门教程1 turtle绘图-2函数

菲波那契序列: >>> # Fibonacci series:... # the sum of two elements defines the next... a, b = 0, 1>>> while b < 10:... print(b)... a, b = b, a+b...112......

python测试开发人工智能安全
今天
0
0
java环境变量配置最正确的方式

原贴:https://blog.csdn.net/qq_40007997/article/details/79784711,十分详细,亲测有效

kitty1116
今天
0
0
49.Nginx防盗链 访问控制 解析php相关 代理服务器

12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配置(502的问题) 12.16 Nginx代理 扩展 502问题汇总 http://ask.apelearn.com/question/9109 location优先级 http://blog....

王鑫linux
今天
1
0
Nginx防盗链、访问控制、解析php相关配置、Nginx代理

一、Nginx防盗链 1. 编辑虚拟主机配置文件 vim /usr/local/nginx/conf/vhost/test.com.conf 2. 在配置文件中添加如下的内容 { expires 7d; valid_referers none blocked server_names *.tes......

芬野de博客
今天
0
0
spring EL 和资源调用

资源调用 import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.PropertySource;import org.springframework.core.io.Resource;......

Canaan_
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部