HttpClient apache上篇

1.什么是HttpClient

  Http 是Hyper-Text Transfer Protocol简写,迄今为止互联网应用最普遍的协议。网络服务、互联网应用、网络计算需求的增加,持续推进http协议应用范围不断扩展。java

  java.net包提供http方式访问资源的最基本功能,httpClient在其基础上提供功能更丰富、更灵活的http请求能力,例如web浏览器、web服务客户端或扩展http协议进行分布式通讯等。web

2.基本功能及概念

http request : 全部http请求是由方法名+请求URI+HTTP协议版本号组成。HttpClient提供全部方法的封装类:HttpGet, HttpHead, HttpPost, HttpPut, HttpDelete, HttpTrace, and HttpOptions.浏览器

HttpGet httpget = new HttpGet(
"http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq=f&oq=");

http response: http response是server收到request请求并响应后,返回给client的消息。httpClient返回信息 包括协议版本号+返回码+文本。安全

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
HttpStatus.SC_OK, "OK");

http headers:Http消息(包括request、response)能够包含一部分属性字段,用来描述消息,例如:content length、content type等等网络

http entity(实体): HTTP协议定义post和put请求能携带内容实体,默认response都应该封闭实体,可是HEAD方法的response和204,304,205返回例外。根据内容来源,http实体分为如下三种:streamedself-containedwrapping并发

3.链接管理

Connection persistence : HttpClient支持长链接。一次链接握手的消耗是很明显的,若是多个请求能复用链接,吞吐率能获得明显提高。app

HTTP connection routing : HttpClient支持直接和间接路由访问目标host。HttpRoutePlanner 接口提供路由策略。socket

Secure HTTP connections :若是http 链接上传输的信息不能被未受权的第三方获取,则认为是安全链接。SSL/TLS protocol是应用最普遍的安全链接协议,通常都是http协议都是经过SSL/TLS加密传输。分布式

HTTP connection managers:  Http链接是复杂、状态的、线程不安全特色,须要链接管理确保功能可用。Http链接每次只能给一个正在执行的线程用。HttpClient使用HttpClientConnectionManager接口定义的实体类来管理访问http链接。ManagedHttpClientConnection做为一个实际链接的代理,管理链接状态和控制IO操做。post

Multithreaded request execution: 

当使用链接池PoolingClientConnectionManager时,HttpClient支持同时并发多个线程执行多个请求。虽然HttpClient实例是线程安全的,文档仍然建议每一个线程拥有专属的HttpContext。

Connection eviction policy(链接驱逐策略):经典的阻塞IO模式下的一个重要缺陷是,网络socket只在IO操做阻塞时,才能对IO事件做出反应。当链接释放给manager后,链接仍然保持活,可是不能监测socket状态,也不能处理任何IO事件。HttpClient使用一个专门的监测线程,赶走那些长时间不活动的链接。周期性调用ClientConnectionManager#closeExpiredConnections(),关闭超期链接并从链接池驱赶已关闭链接。

 Connection keep alive strategy(链接保持策略):

Http Servers使用Keep-Alive header告诉client,server侧打算保持这个链接的时长秒数。若是字段keep-alive没有指定,默认状况下server会关闭长时间不活动的链接。为了防止默认保持策略可能效果不够好,能够定义本身的 ConnectionKeepAliveStrategy myStrategy。

Connection socket factories: 

ConnectionSocketFactor接口提供建立、初始化、链接socket,PlainConnectionSocketFactory是默认建立、初始化不加密sockets。

Hostname verification(主机名校验): 

为了信任校验和客户端受权,HttpClient可选的验证target hostname是否匹配server X.509证书中的主机名单,这个验证机制保证server受权的链接。X509HostnameVerifier接口表示主机校验。

HttpClient proxy configuration:HttpClient仅支持直连或者一跳代理。经过代理访问,即配置默认代理参数,以下

HttpHost proxy = new HttpHost("someproxy", 8080);
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
CloseableHttpClient httpclient = HttpClients.custom()
.setRoutePlanner(routePlanner)
.build();

或者使用标准JRE proxy选择器获取代理信息:

SystemDefaultRoutePlanner routePlanner = new SystemDefaultRoutePlanner(
ProxySelector.getDefault());
CloseableHttpClient httpclient = HttpClients.custom()
.setRoutePlanner(routePlanner)
.build();

或者实现RoutePlanner:

HttpRoutePlanner routePlanner = new HttpRoutePlanner() {
public HttpRoute determineRoute(
HttpHost target,
HttpRequest request,
HttpContext context) throws HttpException {
return new HttpRoute(target, null, new HttpHost("someproxy", 8080),
"https".equalsIgnoreCase(target.getSchemeName()));
}
};
CloseableHttpClient httpclient = HttpClients.custom()
.setRoutePlanner(routePlanner)
.build();
}
}
相关文章
相关标签/搜索