• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

HttpClient4.2 Fluent API学习

mysql 搞代码 4年前 (2022-01-09) 14次浏览 已收录 0个评论

相比于HttpClient 之前的版本,HttpClient 4.2 提供了一组基于流接口(fluent interface)概念的更易使用的API,即Fluent API. 为了方便使用,Fluent API只暴露了一些最基本的HttpClient功能。这样,Fluent API就将开发者从连接管理、资源释放等繁杂的操作中解

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

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

http://blog.gaodaima.com/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.gaodaima.com/vector_yi")                .connectTimeout(1000)                .socketTimeout(1000)                .execute().returnContent().asString();        //以Http/1.1版本协议执行一个POST请求,同时配置Expect-continue handshake达到性能调优,        //请求中包含String类型的请求体并将响应内容作为byte[]返回        Request.Post("http://blog.gaodaima.com/vector_yi")                .useExpectContinue()                .version(HttpVersion.HTTP_1_1)                .bodyString("Important stuff", ContentType.DEFAULT_TEXT)                .execute().returnContent().asBytes();        //通过代理执行一个POST请求并添加一个自定义的头部属性,请求包含一个HTML表单类型的请求体        //将返回的响应内容存入文件        Request.Post("http://blog.gaodaima.com/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> queue = new LinkedList<Future>();        // 异步执行GET请求        for (final Request request: requests) {    <strong>本文来源gaodai#ma#com搞@代~码^网+</strong>        Future future = async.execute(request, new FutureCallback() {                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 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() {            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);    }}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:HttpClient4.2 Fluent API学习

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址