最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

HttpClient4.2FluentAPI学习

来源:动视网 责编:小采 时间:2020-11-09 07:56:20
文档

HttpClient4.2FluentAPI学习

HttpClient4.2FluentAPI学习:相比于HttpClient 之前的版本,HttpClient 4.2 提供了一组基于流接口(fluent interface)概念的更易使用的API,即Fluent API. 为了方便使用,Fluent API只暴露了一些最基本的HttpClient功能。这样,Fluent API就将开发者从连接管理、资源释放等
推荐度:
导读HttpClient4.2FluentAPI学习:相比于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 之前的版本,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> queue = new LinkedList>();
 // 异步执行GET请求
 for (final Request request: requests) {
 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);
 }

}

文档

HttpClient4.2FluentAPI学习

HttpClient4.2FluentAPI学习:相比于HttpClient 之前的版本,HttpClient 4.2 提供了一组基于流接口(fluent interface)概念的更易使用的API,即Fluent API. 为了方便使用,Fluent API只暴露了一些最基本的HttpClient功能。这样,Fluent API就将开发者从连接管理、资源释放等
推荐度:
标签: 学习 API 4.2
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top