HttpClient入门与实战案例详解
HttpClient是Apache提供的HTTP客户端编程工具包,支持多种HTTP请求操作。文章介绍了两种Java实现方式:Java标准库的java.net.http.HttpClient(Java11+)和功能更丰富的Apache HttpClient。详细讲解了核心API如HttpClient、HttpGet、HttpPost的使用方法,并提供了GET/POST请求的完整代码示例。特别指出常见
HttpClient
1、基础知识
(1)介绍
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。它用于发送 HTTP 请求并处理 HTTP 响应。通过这个类,开发者可以方便地进行诸如发起 GET、POST 等常见的 HTTP 请求操作,获取服务器返回的数据, 例如获取网页内容、调用 RESTful API 等。
在 Java 中,有两种常用方式可以使用 HttpClient 发送 POST 请求,分别是 Java 标准库自带的java.net.http.HttpClient(Java 11 及以上版本可用)和 Apache HttpClient。两种方式都能实现发送 POST 请求的功能。
java.net.http.HttpClient 是 Java 标准库的一部分,使用起来更加简洁现代;而 Apache HttpClient 功能丰富,有大量的扩展和成熟的生态,在老项目中使用较为广泛。
以下是Apache HttpClient方式的具体使用示例:
(2)pom依赖
HttpClient依赖:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
阿里云OSS依赖:底层使用httpclient,所以不再需要导入HttpClient依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
示意图:
(3)核心 API
- HttpClient:核心接口,定义 HTTP 请求执行等基础方法。
- HttpClients:工具类,用于创建CloseableHttpClient实例。
- CloseableHttpClient:HttpClient的实现类,需手动关闭以释放资源。
- HttpGet:用于构建 HTTP GET 请求,获取服务器资源。
- HttpPost:用于构建 HTTP POST 请求,向服务器提交数据。
发送请求步骤为:先调用HttpClients的方法创建HttpClient对象,再创建 HTTP 请求对象(如HttpGet或HttpPost),最后调用HttpClient的execute方法发送请求。
2、入门案例
创建HttpClientTest类
(1)HttpGet测试
通过本地获取响应,使用User客户端获取店铺营业状态(记得打开Redis),否则响应码为500
获取地址:http://localhost:8080/user/shop/status
当然也可以请求其他的地址如百度:百度一下,你就知道
位置:sky-server/src/test/java/com/sky/HttpClientTest.java
具体代码:
package com.sky;
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;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.net.http.HttpClient;//后续要删除
@SpringBootTest
public class HttpClientTest {
@Test
public void testGet() throws Exception {
//创建一个HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建一个请求对象,指定请求方法为GET,请求地址为
HttpGet httpGet = new HttpGet("http://localhost:8080/user/shop/status");
//发送请求,并获取响应
CloseableHttpResponse response = httpClient.execute(httpGet);
//解析响应码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("服务端返回的状态码: " + statusCode);
//获取响应内容
HttpEntity entity = response.getEntity();
String body = EntityUtils.toString(entity);
System.out.println("服务端返回的响应内容: " + body);
//关闭资源
response.close();
httpClient.close();//
}
}
示意图:
错误显示:
java: 程序包java.net.http不存在
错误可能原因:
我们导入了"import java.net.http.HttpClient;"而在前面我们已经导入“import org.apache.http.HttpEntity;”而我们的代码实际使用的是 Apache HttpClient(org.apache.http 相关类)也就是已经导入,但却错误导入了 Java 标准库的 java.net.http.HttpClient,编译器虽不会强制报错,但会导致不必要的混淆(比如这次的 “包不存在” 错误),而显示包不存在的核心原因是 JDK 版本不兼容——java.net.http.HttpClient 是 Java 11 及以上版本才加入的标准库类,若你的项目使用的 JDK 版本低于 11,即使写了导入语句,JDK 里也根本没有这个包,自然会提示 “包不存在”
解决办法:
(1)删除“import java.net.http.HttpClient;”
代码逻辑:所有 HTTP 操作都基于 Apache HttpClient(org.apache.http包下的类),与java.net.http无关,删除后错误就会消失。
(2)IDE 配置:
以 IDEA 为例,进入「File → Project Structure → Project Settings」,确认「Project SDK」和「Project language level」均设置为 17。
(2)HttpPost测试
添加的代码:
/**
* 测试通过httpclient发送POST方式的请求
*/
@Test
public void testPOST() throws Exception{
// 创建httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建请求对象,指定请求方法为POST,请求地址为http://localhost:8080/admin/employee/login
HttpPost httpPost = new HttpPost("http://localhost:8080/admin/employee/login");
//设置请求参数,由于参数是json格式,因此需要设置请求编码方式和数据格式
JSONObject jsonObject = new JSONObject();
jsonObject.put("username","admin");
jsonObject.put("password","123456");
StringEntity entity = new StringEntity(jsonObject.toString());
//指定请求编码方式
entity.setContentEncoding("utf-8");
//数据格式
entity.setContentType("application/json");
//设置请求参数
httpPost.setEntity(entity);
//发送请求
CloseableHttpResponse response = httpClient.execute(httpPost);
//解析返回结果
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("响应码为:" + statusCode);
HttpEntity entity1 = response.getEntity();
String body = EntityUtils.toString(entity1);
System.out.println("响应数据为:" + body);
//关闭资源
response.close();
httpClient.close();
}
示意图:
测试结束后记得把@SpringBootTest注释掉,否则每次启动项目都会执行这些测试案例
3、示例
(1)GET 请求的示例
以下是一个简单的使用java.net.http.HttpClient发送 GET 请求的示例:
代码:
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws IOException, InterruptedException {
// 创建HttpClient实例
HttpClient client = HttpClient.newHttpClient();
// 创建HttpRequest请求,指定请求的URI(这里以百度首页为例)
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.baidu.com"))
.build();
// 发送请求并获取HttpResponse响应
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
// 输出响应状态码
System.out.println("响应状态码: " + response.statusCode());
// 输出响应体内容
System.out.println("响应体: " + response.body());
}
}
代码解释:
在上述代码中,通过导入 java.net.http.HttpClient 以及相关的类,实现了向百度首页发送 GET 请求,并获取和处理响应的功能。
(2)POST 请求示例
使用HttpClient 发送 POST 请求示例
代码:
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;
import java.io.IOException;
public class ApachePostRequestExample {
public static void main(String[] args) {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 创建HttpPost对象,指定请求URL
HttpPost httpPost = new HttpPost("http://example.com/api/endpoint");
// 构建请求体,这里同样以JSON数据为例
String jsonBody = "{\"key\":\"value\",\"name\":\"John\"}";
StringEntity entity = new StringEntity(jsonBody);
entity.setContentType("application/json");
httpPost.setEntity(entity);
// 发送请求并获取响应
try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
// 获取响应状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("响应状态码: " + statusCode);
// 获取响应体内容
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null) {
String responseBody = EntityUtils.toString(responseEntity);
System.out.println("响应体: " + responseBody);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
更多推荐
所有评论(0)