apache fluent api
来源:互联网 发布:华东师大公共数据库 编辑:程序博客网 时间:2024/05/30 22:42
相比于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()) .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); }}
0 0
- apache fluent api
- Apache HttpComponents(HTTPClient) Fluent API 使用
- Apache HttpClient4.3 Fluent API使用心得小结
- apache fluent 乱码
- Entity Framework Fluent API
- Apache HttpClient Fluent API:在后台线程中异步执行多个请求
- HttpClient Fluent API 的使用
- HttpClient4.2 Fluent API学习
- HttpClient4.2 Fluent API学习
- HttpClient4.2 Fluent API学习
- EF框架 Code First Fluent API
- EF CodeFirst 约定、注释及Fluent API
- Entity Framework Fluent API and Indexing
- EF Mappings1 Entity Mappings using Fluent API
- EF Mapping2 Entity Framework Fluent API
- EF Mapping Entity Framework Fluent API
- EF Mapping Entity Framework Fluent API
- HttpClient 之Fluent API 简单使用
- 图片压缩算法
- 2014年WEB高手都在做什么
- servlet 的那些事
- WSHttp 绑定和 WSDualHttp 绑定的负载平衡 aspNetCompatibilityEnabled
- 1、SVN学习之windows下svn的安装
- apache fluent api
- OJ刷题之《发工资咯》
- BZOJ 3611 HEOI 2014 大工程 LCA单调性
- jira插件开发远程调试
- Python之深拷贝和浅拷贝
- Android Fragment 真正的完全解析(上)
- Python菜鸟晋级04----raw_input() 与 input()的区别
- Object C 选择结构
- Android Fragment 真正的完全解析(下)