最近在Apache Httpcomponents中里查找资料意外发现了HC(HttpClient简写)发送http请求的一种简写形式,当时看到的场面时这样的:
瞬间感觉被征服了。翻译一下上述内容:同样的请求也可以使用更简单、更灵活、更流畅的API来执行。官方API文档:http://hc.apache.org/httpcomponents-client-ga/fluent-hc/apidocs/index.html
一、添加依赖
下面开始尝试一下怎么使用这个API吧,先得引入依赖,官网有介绍,直接复制到项目的pom.xml文档中即可:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>fluent-hc</artifactId>
<version>4.5.8</version>
</dependency>
二、执行简单的http请求
1.Get请求
@Test
public void testGet(){
try {
String response = Request.Get("https://reqres.in//api/users?page=2")
.execute()
.returnContent()
.asString();
System.out.println(response);
} catch (IOException e) {
e.printStackTrace();
}
}
控制台输出:
2. Post请求
@Test
public void testPost() {
try {
String response = Request.Post("https://reqres.in/api/users")
.addHeader("Content-Type","application/x-www-form-urlencoded")
.bodyForm(Form.form().add("name","chenfeng").add("job","tester").build())
.execute()
.returnContent()
.asString();
System.out.println(response);
} catch (IOException e) {
e.printStackTrace();
}
}
控制台输出:
3.利用线程池发送异步请求
@Test
public void testThreadPool() {
// 初始化线程池
ExecutorService service = Executors.newFixedThreadPool(2);
Async async = Async.newInstance().use(service);
Request[] requests = new Request[]{
Request.Get("https://reqres.in/api/users?page=1"),
Request.Get("https://reqres.in/api/users?page=2"),
Request.Get("https://reqres.in/api/users?page=3"),
Request.Get("https://reqres.in/api/users?page=4")
};
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 completed(Content content) {
System.out.println(request + "\r\nRequest response:" + content);
}
public void failed(Exception e) {
System.out.println(e.getMessage() + ": " + request);
}
public void cancelled() {
}
});
queue.add(future);
}
while (!queue.isEmpty()) {
Future<Content> future = queue.remove();
try {
future.get();
} catch (ExecutionException ex) {
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
3.控制台输出: