HttpClient4.2 Fluent API使用方法

Fluent提供了很轻量级的Http请求方法,Fluent API只暴露了一些最基本的HttpClient功能。这样,Fluent API就将开发者从连接管理、资源释放等繁杂的操作中解放出来,从而更易进行一些HttpClient的简单操作。

maven依赖引入

    <dependency>
		<groupId>org.apache.httpcomponents</groupId>
		<artifactId>httpclient</artifactId>
		<version>4.5</version>
	</dependency>
	<dependency>
		<groupId>org.apache.httpcomponents</groupId>
		<artifactId>fluent-hc</artifactId>
		<version>4.5.2</version>
	</dependency>

一、基本使用方法

GET 请求,添加header信息:
String result = EntityUtils.toString(Request.Get("http://www.cewan.la").addHeader("Referer", "http://www.baidu.com").execute().returnResponse().getEntity()); //返回的内容及即为响应结果

POST请求,添加body信息:
String result = EntityUtils.toString(Request.Post(url).bodyString(JSON.toJSONString(obj), ContentType.APPLICATION_JSON).execute().returnResponse().getEntity(),"UTF-8");//返回的内容及即为响应结果


其他参数配置实例:
        //执行一个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())  
                .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);  
    }  
  
}  

 

转载于:https://my.oschina.net/u/2391658/blog/869300

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值