Httpclient小结
Httpclient小结
jhonephone 发表于3年前
Httpclient小结
  • 发表于 3年前
  • 阅读 60
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: httpclient

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。

共有 人打赏支持
粉丝 4
博文 19
码字总数 24506
×
jhonephone
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: