HttpClient apache上篇
1.什么是HttpClient
Http 是Hyper-Text Transfer Protocol简写,迄今为止互联网应用最广泛的协议。网络服务、互联网应用、网络计算需求的增长,持续推动http协议应用范围不断扩展。
java.net包提供http方式访问资源的最基本功能,httpClient在其基础上提供功能更丰富、更灵活的http请求能力,例如web浏览器、web服务客户端或扩展http协议进行分布式通信等。
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实体分为以下三种:streamed、self-contained、wrapping。
3.连接管理
Connection persistence : HttpClient支持长连接。一次连接握手的消耗是很明显的,如果多个请求能复用连接,吞吐率能得到明显提升。
HTTP connection routing : HttpClient支持直接和间接路由访问目标host。HttpRoutePlanner 接口提供路由策略。
Secure HTTP connections :如果http 连接上传输的信息不能被未授权的第三方获取,则认为是安全连接。SSL/TLS protocol是应用最广泛的安全连接协议,一般都是http协议都是通过SSL/TLS加密传输。
HTTP connection managers: Http连接是复杂、状态的、线程不安全特点,需要连接管理确保功能可用。Http连接每次只能给一个正在执行的线程用。HttpClient使用HttpClientConnectionManager接口定义的实体类来管理访问http连接。ManagedHttpClientConnection作为一个实际连接的代理,管理连接状态和控制IO操作。
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(); } }