Java-HTTP客户端:发送请求与处理响应
在测试中使用HTTP客户端发送 HTTP 请求(GET、POST 等)来调用接口,并对响应结果进行解析和验证。
核心流程:创建客户端 → 构建请求(URL/头/体) → 执行 → 解析响应
1、Java 标准库:HttpURLConnection(基础)
- Java 标准库 HttpURLConnection:API 较底层、使用不便,适合非常简单的请求,推荐使用其它第三方库
- Apache HttpClient:功能强大、成熟稳定、配置灵活,需要添加依赖、API 稍复杂
- OkHttp:性能优异、API 简洁,需要添加依赖
- RestAssured:专为测试设计,需要添加依赖、学习成本
2、Apache HttpClient(推荐使用,功能强大)
| 核心类/接口 | 作用 |
|---|---|
CloseableHttpClient |
HTTP 客户端对象,用于执行请求。每个测试类通常创建一个共享实例,以提高性能。 |
HttpGet / HttpPost |
表示具体的 HTTP 请求方法,可设置 URL、请求头、请求体等。 |
HttpResponse |
封装了服务器返回的响应,包含状态行、响应头、响应体等。 |
EntityUtils.toString() |
工具方法,用于将响应实体(HttpEntity)转换为字符串。注意编码。 |
StringEntity |
用于封装字符串类型的请求体(如 JSON 或 XML)。 |
| 发送 GET 请求 |
import org.apache.http.HttpResponse; 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 HttpClientGetDemo { public static void main(String[] args) { // 1. 创建可关闭的 HttpClient 实例 try (CloseableHttpClient client = HttpClients.createDefault()) { // 2. 创建 GET 请求对象 HttpGet httpGet = new HttpGet("https://api.example.com/users/1"); // 可选:设置请求头 httpGet.setHeader("Accept", "application/json"); // 3. 执行请求,获取响应对象 HttpResponse response = client.execute(httpGet); // 4. 处理响应 int statusCode = response.getStatusLine().getStatusCode(); String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8"); System.out.println("状态码: " + statusCode); System.out.println("响应体: " + responseBody); } catch (Exception e) { e.printStackTrace(); } } } |
| 发送 POST 请求 |
import org.apache.http.HttpResponse; 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 HttpClientPostDemo { public static void main(String[] args) { try (CloseableHttpClient client = HttpClients.createDefault()) { HttpPost httpPost = new HttpPost("https://api.example.com/users"); // 1. 设置请求头,标明发送 JSON 数据 httpPost.setHeader("Content-Type", "application/json"); httpPost.setHeader("Accept", "application/json"); // 2. 构造 JSON 请求体 String json = "{\"name\":\"Alice\", \"age\":30}"; StringEntity entity = new StringEntity(json, "UTF-8"); httpPost.setEntity(entity); // 3. 执行请求 HttpResponse response = client.execute(httpPost); // 4. 处理响应 System.out.println("状态码: " + response.getStatusLine().getStatusCode()); System.out.println("响应体: " + EntityUtils.toString(response.getEntity(), "UTF-8")); } catch (Exception e) { e.printStackTrace(); } } } |
| 核心配置:超时和连接管理 |
import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; // 创建带超时配置的 HttpClient RequestConfig config = RequestConfig.custom() .setConnectTimeout(5000) // 连接超时(毫秒) .setSocketTimeout(3000) // 读取数据超时 .setConnectionRequestTimeout(2000) // 从连接池获取连接的超时时间 .build(); CloseableHttpClient client = HttpClientBuilder.create() .setDefaultRequestConfig(config) .build(); |
-
处理响应:获取到响应体字符串后,通常需要结合 JSON 解析库(如 Jackson、Gson)将字符串转换为 Java 对象,便于后续断言和验证。
-
异常处理:在实际测试中,可以分别捕获 ConnectTimeoutException、SocketTimeoutException 等,以便对不同的网络问题做出更精确的判断和处理。
3、测试中的典型场景
-
单接口测试:直接调用待测接口,验证响应状态码和返回数据是否符合预期。
-
多接口联调:模拟用户操作流程(如登录→查询→修改),验证数据流转正确性。
-
认证与授权:在请求头中携带 Token 或 Cookie 进行接口调用。
-
数据驱动测试:从数据文件中读取多组参数,循环发送请求,验证不同输入下的响应。
-
性能测试前置:使用 HTTP 客户端编写脚本,为压力测试准备基础数据或执行预热。
本文来自博客园,作者:Fēngwèi,转载请注明原文链接:https://www.cnblogs.com/fengwei-blogs/p/22516768

浙公网安备 33010602011771号