介绍
Jetty HTTP client模块提供易用的API、工具类和一个高性能、异步的实现来执行HTTP和HTTPS请求。
Jetty HTTP client模块要求Java版本1.7或者更高,Java 1.8的应用能用lambda表达式在一些HTTP client API中。
Jetty HTTP client被实现和提供一个异步的API,不会因为I/O时间阻塞,因此使它在线程的利用上更有效率,并很适合用于负载测试和并行计算。
然而,有时你所有需要做的是对一个资源执行一个GET请求,HTTP client也提供了一个异步API,发起请求的线程将阻塞直到请求处理完成。
在外部来看,Jetty HTTP client提供:
1)重定向支持;重定向编码例如302或者303被自动跟随;
2)Cookies支持;被服务端送的cookies在匹配的请求中被送回到服务端;
3)认证支持;HTTP “Basic”和“Digest”热症被支持,其它的可以增加;
4)前转协议支持。
初始化
主要的类的名称是org.eclipse.jetty.client.HttpClient,同Jetty 7和Jetty 8中一样(虽然它和Jetty 7和Jetty 8中的同名类不是向后兼容的)。
你可以将一个HttpClient实例看作一个浏览器实例。像一个浏览器,它能发起请求到不同的域,它管理重定向、cookies和认证,你能用代理配置它,并且他提供给你你发起的请求的响应。
为了使用HttpClient,你必须初始化它、配置它、然后启动它:
// Instantiate HttpClient
HttpClient httpClient = new HttpClient();
// Configure HttpClient, for example:
httpClient.setFollowRedirects(false);
// Start HttpClient
httpClient.start();
你能创建多个HttpClient的实例;原因可能是你想指定不同的配置参数(例如,一个实例被配置为前转代理而另一个不是),或者因为你想有两个实例履行象两个不同的浏览器,因此有不同的cookies、不同的认证证书等等。
当你用参数构造器创建一个HttpClient实例时,你仅能履行简单的HTTP请求,并且你将不能履行HTTPS请求。
为了履行HTTPS请求,你首先应该创建一个SslContextFactory,配置它,并且传递它到HttpClient的构造器。当用一个SslContextFactory创建时,HttpClient将能履行HTTP和HTTPS请求到任何域。
// Instantiate and configure the SslContextFactory
SslContextFactory sslContextFactory = new SslContextFactory();
// Instantiate HttpClient with the SslContextFactory
HttpClient httpClient = new HttpClient(sslContextFactory);
// Configure HttpClient, for example:
httpClient.setFollowRedirects(false);
// Start HttpClient
httpClient.start();
API介绍
阻塞API
为了履行一个HTTP请求更简单的方法是:
ContentResponse response = httpClient.GET(<a target=_blank href="http://domain.com/path?query">http://domain.com/path?query</a>);
方法HttpClient.GET(...)履行一个HTTP GET请求到一个给定的URI,成功后返回一个ContentResponse。
ContentResponse对象包含HTTP响应信息:状态码、headers和可能的内容。内容长度默认被限制到2M;下面“响应内容处理”会介绍怎么处理更大的内容。
如果你想定制请求,例如通过发起一个HEAD请求代替一个GET,并且仿真一个浏览器用户代理,你能使用这种方式:
ContentResponse response = httpClient.newRequest("http://domain.com/path?query")
.method(HttpMethod.HEAD)
.agent("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0")
.send();
下面是采用简写的方式:
Request request = httpClient.newRequest("http://domain.com/path?query");
request.method(HttpMethod.HEAD);
request.agent("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0");
ContentResponse response = request.send();
你首先用httpClient.newRequest(...)创建了一个请求对象,然后你定制它。当请求对象被定制后,你调用Request.send(),当请求处理玩陈过后&