简介
HTTP(超文本传输协议
)相信大家都已经很熟悉了,作为Internet上使用最多、最重要的协议之一,已经被越来越多的应用程序用来访问网络资源,目前使用最广泛的Java语言也不例外。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
HttpClient
不是一个浏览器,而是一个客户端HTTP传输库,只能以编程的方式通过其API用于发送和接受HTTP消息。它不会尝试处理内容,也不会执行嵌入html页面的 JavaScript和尝试猜测内容类型(如果没有明确设置),或者重新格式化请求/重写位置URI或与HTTP传输无关的其他功能。
主要功能
- 实现了所有 HTTP 的方法(GET、POST、PUT、DELETE等)
- 支持 HTTPS 协议
- 支持代理服务器
- 支持自动转向等
使用步骤
HttpClient
发送请求和接收响应,一般需要以下几个步骤。
- 创建
HttpClient
实例对象 - 创建某种连接方式的相应实例
- 受用第一步创建的对象发送请求,并接受响应
- 释放连接。
实例代码
首先我们在pom.xml
中添加如下配置,以便我们使用HttpClient
进行测试。
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.8</version>
</dependency>
HTTP GET
请求方法实例
package com.lincain.httpclient;
import java.net.URI;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class HttpGetExampleDemo {
public static void main(String[] args) throws Exception{
CloseableHttpClient httpClient = null;
CloseableHttpResponse response = null;
try {
// 1.创建HttpClient实例对象
httpClient = HttpClients.createDefault();
// 2.创建GET连接方式的相应实例
String url = "http://httpbin.org/get";
URIBuilder builder = new URIBuilder(url);
// 如果是get请求带参,需要添加一下代码,param:参数名称,value:参数值
// builder.addParameter(param, value);
// ......
URI uri = builder.build();
HttpGet httpGet = new HttpGet(uri);
System.out.println("Executing request:" + httpGet.getRequestLine());
System.out.println("-----------------");
// 3.用第一步创建的对象发送请求,并接收响应
response = httpClient.execute(httpGet);
String responseString = null;
int status = response.getStatusLine().getStatusCode();
if (status >= 200 && status < 300) {
responseString = EntityUtils.toString(response.getEntity());
}
System.out.println(responseString);
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (response != null) {
response.close();
}
// 4.释放连接,无论执行方法是否成功,都必须释放连接
httpClient.close();
} catch (Exception e2) {
e2.getSuppressed();
}
}
}
}
执行上述代码后,得到如下结果:
Executing request:GET http://httpbin.org/get HTTP/1.1
-----------------
{
"args": {},
"headers": {
"Accept-Encoding": "gzip,deflate",
"Host": "httpbin.org",
"User-Agent": "Apache-HttpClient/4.5.8 (Java/1.8.0_171)"
},
"origin": "171.88.28.143, 171.88.28.143",
"url": "https://httpbin.org/get"
}
在上述的代码中,我们使用GET
方式向指定的URL:http://httpbin.org/get 发出请求,检索相应资源,完成后服务器向我们响应了一个json对象。
HTTP POST
请求方法实例
package com.taotao.test;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class HttpPostExampleDemo {
public static void main(String[] args) {
CloseableHttpClient httpClient = null;
CloseableHttpResponse response = null;
try {
// 1.创建HttpClient实例对象
httpClient = HttpClients.createDefault();
// 2.创建POST连接方式的相应实例
String uri = "http://httpbin.org/post";
HttpPost httpPost = new HttpPost(uri);
httpPost.setEntity(new StringEntity("Hello HttpClient"));
/*
1. 设置实体方式1
List<NameValuePair> paramList = new ArrayList<>();
paramList.add(new BasicNameValuePair(key, value);
....
// 模拟表单
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
httpPost.setEntity(entity);
2. 设置实体方式2
// 其中的json为json格式数据
StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
httpPost.setEntity(entity);
*/
System.out.println("Executing request:" + httpPost.getRequestLine());
System.out.println("------------------");
// 3.用第一步创建的对象发送请求,并接收响应
response = httpClient.execute(httpPost);
String responseString = "";
int status = response.getStatusLine().getStatusCode();
if (status >= 200 && status < 300) {
responseString = EntityUtils.toString(response.getEntity());
}
System.out.println(responseString);
}catch (Exception e) {
e.printStackTrace();
}
finally {
try {
if (response != null) {
response.close();
}
// 4.释放连接,无论执行方法是否成功,都必须释放连接
httpClient.close();
} catch (Exception e2) {
e2.getSuppressed();
}
}
}
}
执行上述代码后,得到如下结果:
Executing request:POST http://httpbin.org/post HTTP/1.1
------------------
{
"args": {},
"data": "Hello HttpClient",
"files": {},
"form": {},
"headers": {
"Accept-Encoding": "gzip,deflate",
"Content-Length": "16",
"Content-Type": "text/plain; charset=ISO-8859-1",
"Host": "httpbin.org",
"User-Agent": "Apache-HttpClient/4.5.8 (Java/1.8.0_171)"
},
"json": null,
"origin": "171.88.28.143, 171.88.28.143",
"url": "https://httpbin.org/post"
}
在上述的代码中,我们使用POST
方式向指定的URL:http://httpbin.org/post 发出请求,将数据发布到服务器上,完成后服务器向我们响应了一个json对象。
总结
本文介绍了参考了HttpClient
中文翻译文档和易百教程,对HttpClient
的特性进行了简单介绍,并通过代码实例对GET
和POST
两种连接方式的使用方法进行演示。