
HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP 协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version> </dependency
确实,写常规的增删改查项目时确实用不到HttpClient。我来给你讲清楚:
HttpClient 是Apache提供的一个HTTP客户端工具包,用来发送HTTP请求并接收HTTP响应。
简单说:它是让Java程序自己充当"浏览器"去访问其他网站或接口的工具。
因为我们之前写的项目都是:
text
浏览器 → 你的后端程序(Controller)→ 数据库java
// 假设你的项目需要查天气预报
// 你不能自己预测天气,得调用第三方接口
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.weather.com/current?city=北京"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
String weatherData = response.body();真实案例:
java
// 订单服务需要查用户信息
// 用户信息在另一个服务里
String userInfo = httpClient.get("http://user-service/users/123");java
// 爬取网页内容
String html = httpClient.get("https://www.csdn.net");虽然你没直接写HttpClient代码,但你用的很多依赖内部已经用了类似的东西:
你在用的 | 内部其实用了 |
|---|---|
阿里云OSS SDK | 封装了HTTP请求 |
微信支付SDK | 封装了HTTP请求 |
RestTemplate | Spring封装的HTTP客户端 |
OpenFeign | 微服务调用的HTTP客户端 |
角色 | 现实类比 | 代码中 |
|---|---|---|
浏览器 | 你去店里买东西 | 前端发请求 |
你的后端 | 你是店员 | Controller接收请求 |
HttpClient | 你打电话问供货商要货 | 后端主动请求其他服务 |
在我们以后的开发中,遇到这些情况就要用:
>
java
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class HttpClientGetExample {
public static void main(String[] args) {
// 1. 创建HttpClient对象(相当于打开浏览器)
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 2. 创建HttpGet请求(相当于输入网址)
HttpGet httpGet = new HttpGet("https://api.github.com/users/octocat");
// 3. 添加请求头(可选,模拟浏览器)
httpGet.setHeader("User-Agent", "Mozilla/5.0");
// 4. 发送请求,获取响应(相当于按回车)
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
// 5. 获取响应状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("状态码:" + statusCode);
// 6. 获取响应内容
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity, "UTF-8");
System.out.println("响应内容:");
System.out.println(result);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}text
状态码:200
响应内容:
{
"login": "octocat",
"id": 583231,
"name": "The Octocat",
...
}java
import org.apache.http.HttpEntity;
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 HttpClientPostExample {
public static void main(String[] args) {
// 1. 创建HttpClient
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 2. 创建HttpPost请求
HttpPost httpPost = new HttpPost("https://jsonplaceholder.typicode.com/posts");
// 3. 设置请求头(告诉服务器发送的是JSON)
httpPost.setHeader("Content-Type", "application/json");
httpPost.setHeader("Accept", "application/json");
// 4. 构建要发送的JSON数据
String json = "{\"title\":\"HttpClient教程\",\"body\":\"这是一个测试\",\"userId\":1}";
// 5. 把JSON数据放到请求体里
StringEntity entity = new StringEntity(json, "UTF-8");
httpPost.setEntity(entity);
// 6. 发送请求
try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
// 7. 获取响应状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("状态码:" + statusCode);
// 8. 获取响应内容
String result = EntityUtils.toString(response.getEntity(), "UTF-8");
System.out.println("响应内容:");
System.out.println(result);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}text
状态码:201
响应内容:
{
"title": "HttpClient教程",
"body": "这是一个测试",
"userId": 1,
"id": 101
}我们已经在项目中把httpcliant封装成了工具包,可以直接使用。
java
import org.apache.http.HttpEntity;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.util.ArrayList;
import java.util.List;
public class HttpClientPostFormExample {
public static void main(String[] args) {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost httpPost = new HttpPost("https://httpbin.org/post");
// 创建表单参数
List<BasicNameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("username", "张三"));
params.add(new BasicNameValuePair("age", "25"));
params.add(new BasicNameValuePair("city", "北京"));
// 设置表单格式
httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
String result = EntityUtils.toString(response.getEntity(), "UTF-8");
System.out.println("状态码:" + response.getStatusLine().getStatusCode());
System.out.println("响应内容:");
System.out.println(result);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}java
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
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 HttpClientUtil {
private static final CloseableHttpClient httpClient = HttpClients.createDefault();
// GET请求
public static String doGet(String url) throws Exception {
HttpGet httpGet = new HttpGet(url);
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
return EntityUtils.toString(response.getEntity(), "UTF-8");
}
}
// POST请求(JSON)
public static String doPostJson(String url, String json) throws Exception {
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("Content-Type", "application/json");
httpPost.setEntity(new StringEntity(json, "UTF-8"));
try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
return EntityUtils.toString(response.getEntity(), "UTF-8");
}
}
// 使用示例
public static void main(String[] args) {
try {
String result = doGet("https://api.github.com/users/octocat");
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}java
// 一定要指定UTF-8
EntityUtils.toString(entity, "UTF-8");
new StringEntity(json, "UTF-8");java
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(5000) // 连接超时 5秒
.setSocketTimeout(5000) // 读取超时 5秒
.build();
httpGet.setConfig(config);java
// 用try-with-resources自动关闭
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
// ...
}请求类型 | 核心代码 | 适用场景 |
|---|---|---|
GET | new HttpGet(url) | 查询数据 |
POST(JSON) | setEntity(new StringEntity(json)) | 提交JSON数据 |
POST(表单) | new UrlEncodedFormEntity(params) | 提交表单 |

结语:如果对你有帮助,请点赞,关注,收藏!