Skip to content

HttpClient

Calvin Xiao edited this page Jan 27, 2014 · 10 revisions

##1. Overview HttpClient有两种选择:

  1. JDK自带的HttpURLConnection 或 Apache HttpClient
  2. Jersey/CXF的Restful Client和 Spring的RestTemplate。

对于很Restful的服务端,Jersey/CXF/Spring的Restful Client能更好的打交道,比如发送和读取Restful应用常用的参数,转换json格式的数据等等。

如果是简单Http请求,不考虑性能可以直接使用HttpURLConnection, 够简单,不需要引入额外依赖包。但HttpURLConnection控制Keep-Alive长连接不方便(见后),还有其他进一步的需求时比如设定最大连接池,Cookies与认证的功能更强等等,换用Apache HttpClient。

##2. Apache Http Client 在showcase的RemoteContentServlet, 演示了多线程安全的,使用了ConnectionPool的Apache HttpClient, 并演示了如何设置SocketTimeout。

2.1 HttpClient4.3 Fluent API

HttpClient原来的API非常复杂,而且还要记着关闭InputStream,Http4.3终于提供了Fluent API, 同样在showcase的RemoteContentServlet中演示。

Request.Get(url).execute().returnContent().asString();

通过翻代码,可以看到它线程安全,所有请求会使用一个公共的连接池,总共200连接,每个destination最多100个连接。而且内容会立刻全部读出然后关闭inputsream,不需要再用代码去关闭。

如果你想设置自己的连接池,或者设置超时,则需要先设置好httpClient,然后传入。

Executor executor = Executor.newInstance(httpClient);
String resultString = executor.execute(Request.Get(url)).returnContent().asString();

##3. JDK HttpConnectionURL 同样在showcase的RemoteContentServlet中演示。

缺陷是长连接只能JVM全局统一配置, 系统变量 http.keepAlive默认为true,http.maxConnections默认为5,是每个destination 的最大连接数。

##Spring RestTemplate/Jersey Client 简单情形下,直接用Spring自带RestTemplate即可,见Spring Restful章节。 当觉得不够用时,可尝试使用Jersey Client, Jersey也是Jax-RS2.0规范对于Client端的参考实现,不过好久没用过Jersey了。