文档章节

HttpClient4.2 Fluent API使用方法

孟飞阳
 孟飞阳
发布于 2017/03/28 16:45
字数 728
阅读 243
收藏 1

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

 

© 著作权归作者所有

孟飞阳
粉丝 217
博文 1054
码字总数 565580
作品 5
朝阳
个人站长
私信 提问
httpClient4.2官方文档研究

前言 超文本传输协议(HTTP)也许是最常用的在互联网上使用的协议。 Web服务,支持网络设备和网络计算的增长继续扩大用户驱动的Web浏览器的HTTP协议之外的作用,同时增加了一些应用程序需要H...

harries
2015/08/24
36
0
8.翻译系列: EF 6中配置领域类(EF 6 Code-First 系列)

原文地址:http://www.entityframeworktutorial.net/code-first/configure-classes-in-code-first.aspx 在前面的章节中,我们学习了Code-First默认的约定。Code-First使用默认的约定,从你的...

灰太狼的梦想
04/02
0
0
Fluent interface(维基百科)

From Wikipedia, the free encyclopedia In software engineering, a fluent interface (as first coined by Eric Evans and Martin Fowler) is an implementation of an object oriented AP......

tantexian
2016/06/12
40
0
如何在自己的项目中实现 Fluent Interface(流畅接口)

如何在自己的项目中实现 Fluent Interface(流畅接口)   布尔的许多早期工作见证了莱布尼茨对恰当的数学符号系统的力量的信念,符号似乎无需什么帮助就能奇迹般地产生出问题的正确答案,为...

tantexian
2016/06/12
94
0
Graphene 2.0.0.Alpha3 发布,Ajax 测试扩展

Graphene 项目的目的是使用非常性感的类型安全的 API 进行 Ajax 测试,是 Selenium 项目的扩展。 值得关注的改进: jQuery Selectors Graphene gets its own annotation and selector in or...

红薯
2013/01/17
323
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
6
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0
一、Django基础

一、web框架分类和wsgiref模块使用介绍 web框架的本质 socket服务端 与 浏览器的通信 socket服务端功能划分: 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... 根据用户访问...

ZeroBit
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部