相比于HttpClient 之前的版本,HttpClient 4.2 提供了一组基于流接口(fluent interface)概念的更易使用的API,即Fluent API.
为了方便使用,Fluent API只暴露了一些最基本的HttpClient功能。这样,Fluent API就将开发者从连接管理、资源释放等繁杂的操作中解放出来,从而更易进行一些HttpClient的简单操作。
(原文地址:http://blog.csdn.net/vector_yi/article/details/24298629转载请注明出处)
还是利用具体例子来说明吧。
以下是几个使用Fluent API的代码样例:
一、最基本的http请求功能
执行Get、Post请求,不对返回的响应作处理
- package com.vectoryi.fluent;
- import java.io.File;
- import org.apache.http.HttpHost;
- import org.apache.http.HttpVersion;
- import org.apache.http.client.fluent.Form;
- import org.apache.http.client.fluent.Request;
- import org.apache.http.entity.ContentType;
- public class FluentRequests {
- public static void main(String[] args)throws Exception {
- //执行一个GET请求,同时设置Timeout参数并将响应内容作为String返回
- Request.Get("http://blog.csdn.net/vector_yi")
- .connectTimeout(1000)
- .socketTimeout(1000)
- .execute().returnContent().asString();
- //以Http/1.1版本协议执行一个POST请求,同时配置Expect-continue handshake达到性能调优,
- //请求中包含String类型的请求体并将响应内容作为byte[]返回
- Request.Post("http://blog.csdn.net/vector_yi")
- .useExpectContinue()
- .version(HttpVersion.HTTP_1_1)
- .bodyString("Important stuff", ContentType.DEFAULT_TEXT)
- .execute().returnContent().asBytes();
- //通过代理执行一个POST请求并添加一个自定义的头部属性,请求包含一个HTML表单类型的请求体
- //将返回的响应内容存入文件
- Request.Post("http://blog.csdn.net/vector_yi")
- .addHeader("X-Custom-header", "stuff")
- .viaProxy(new HttpHost("myproxy", 8080))
- .bodyForm(Form.form().add("username", "vip").add("password", "secret").build(), Charset.forName("UTF-8"))
- .execute().saveContent(new File("result.dump"));
- }
- }
二、在后台线程中异步执行多个请求
- package com.vectoryi.fluent;
- import java.util.LinkedList;
- import java.util.Queue;
- import java.util.concurrent.ExecutionException;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.Future;
- import org.apache.http.client.fluent.Async;
- import org.apache.http.client.fluent.Content;
- import org.apache.http.client.fluent.Request;
- import org.apache.http.concurrent.FutureCallback;
- public class FluentAsync {
- public static void main(String[] args)throws Exception {
- // 利用线程池
- ExecutorService threadpool = Executors.newFixedThreadPool(2);
- Async async = Async.newInstance().use(threadpool);
- Request[] requests = new Request[] {
- Request.Get("http://www.google.com/"),
- Request.Get("http://www.yahoo.com/"),
- Request.Get("http://www.apache.com/"),
- Request.Get("http://www.apple.com/")
- };
- Queue<Future<Content>> queue = new LinkedList<Future<Content>>();
- // 异步执行GET请求
- for (final Request request: requests) {
- Future<Content> future = async.execute(request, new FutureCallback<Content>() {
- public void failed(final Exception ex) {
- System.out.println(ex.getMessage() + ": " + request);
- }
- public void completed(final Content content) {
- System.out.println("Request completed: " + request);
- }
- public void cancelled() {
- }
- });
- queue.add(future);
- }
- while(!queue.isEmpty()) {
- Future<Content> future = queue.remove();
- try {
- future.get();
- } catch (ExecutionException ex) {
- }
- }
- System.out.println("Done");
- threadpool.shutdown();
- }
- }
三、更快速地启动请求
- package com.vectoryi.fluent;
- import org.apache.http.client.fluent.Form;
- import org.apache.http.client.fluent.Request;
- public class FluentQuickStart {
- public static void main(String[] args) throws Exception {
- Request.Get("http://targethost/homepage")
- .execute().returnContent();
- Request.Post("http://targethost/login")
- .bodyForm(Form.form().add("username", "vip").add("password", "secret").build())
- .execute().returnContent();
- }
- }
四、处理Response
在本例中是利用xmlparsers来解析返回的ContentType.APPLICATION_XML类型的内容。
- package com.vectoryi.fluent;
- import java.io.IOException;
- import java.nio.charset.Charset;
- import javax.xml.parsers.DocumentBuilder;
- import javax.xml.parsers.DocumentBuilderFactory;
- import javax.xml.parsers.ParserConfigurationException;
- import org.apache.http.Consts;
- import org.apache.http.HttpEntity;
- import org.apache.http.HttpResponse;
- import org.apache.http.StatusLine;
- import org.apache.http.client.ClientProtocolException;
- import org.apache.http.client.HttpResponseException;
- import org.apache.http.client.ResponseHandler;
- import org.apache.http.client.fluent.Request;
- import org.apache.http.entity.ContentType;
- import org.w3c.dom.Document;
- import org.xml.sax.SAXException;
- public class FluentResponseHandling {
- public static void main(String[] args)throws Exception {
- Document result = Request.Get("http://www.baidu.com")
- .execute().handleResponse(new ResponseHandler<Document>() {
- public Document handleResponse(final HttpResponse response) throws IOException {
- StatusLine statusLine = response.getStatusLine();
- HttpEntity entity = response.getEntity();
- if (statusLine.getStatusCode() >= 300) {
- throw new HttpResponseException(
- statusLine.getStatusCode(),
- statusLine.getReasonPhrase());
- }
- if (entity == null) {
- throw new ClientProtocolException("Response contains no content");
- }
- DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
- try {
- DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
- ContentType contentType = ContentType.getOrDefault(entity);
- if (!contentType.equals(ContentType.APPLICATION_XML)) {
- throw new ClientProtocolException("Unexpected content type:" + contentType);
- }
- Charset charset = contentType.getCharset();
- if (charset == null) {
- charset = Consts.ISO_8859_1;
- }
- return docBuilder.parse(entity.getContent(), charset.name());
- } catch (ParserConfigurationException ex) {
- throw new IllegalStateException(ex);
- } catch (SAXException ex) {
- throw new ClientProtocolException("Malformed XML document", ex);
- }
- }
- });
- // 处理得到的result
- System.out.println(result);
- }
- }