HttpClient Fluent API 起始于HttpClient 4.2。相比于HttpClient之前的版本,HttpClient 4.2 提供了一组基于流接口(fluent interface)概念的更易使用的API,即Fluent API。

为了方便使用,HttpClient Fluent API只暴露了一些最基本的HttpClient功能。这样,HttpClient Fluent API就将开发者从连接管理、资源释放等繁杂的操作中解放出来,从而更易进行一些HttpClient的简单操作。请看下面的例子:

一、执行最基本的HTTP请求功能,执行Get、Post请求,不对返回的响应作处理

public class FluentRequests 
{
 
    public static void main(String[] args)throws Exception 
    {
        //执行一个GET请求,同时设置Timeout参数并将响应内容作为String返回
        Request.Get("http://www.httpclient.cn")
                .connectTimeout(1000)
                .socketTimeout(1000)
                .execute().returnContent().asString();
 
        //以Http/1.1版本协议执行一个POST请求,同时配置Expect-continue handshake达到性能调优,
        //请求中包含String类型的请求体并将响应内容作为byte[]返回
        Request.Post("http://www.httpclient.cn")
                .useExpectContinue()
                .version(HttpVersion.HTTP_1_1)
                .bodyString("Important stuff", ContentType.DEFAULT_TEXT)
                .execute().returnContent().asBytes();
 
 
        //通过代理执行一个POST请求并添加一个自定义的头部属性,请求包含一个HTML表单类型的请求体
        //将返回的响应内容存入文件
        Request.Post("http://www.httpclient.cn")
                .addHeader("X-Custom-header", "stuff")
                .viaProxy(new HttpHost("myproxy", 8080))
                .bodyForm(Form.form().add("username", "root").add("password", "123456").build())
                .execute().saveContent(new File("result.dump"));
    }
}

二、在后台线程中异步执行多个请求


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();
    }
}

三、更快速地启动请求


public class FluentQuickStart 
{
    public static void main(String[] args) throws Exception 
    {
 
        Request.Get("http://www.httpclient.cn")
            .execute().returnContent();
        Request.Post("http://www.httpclient.cn")
            .bodyForm(Form.form().add("username",  "root").add("password",  "123456").build())
            .execute().returnContent();
    }
}