1. 概述
在本教程中,我们将演示如何使用 Java 标准库中的 HttpURLConnection
来发送一个携带 JSON 数据的 POST 请求。
虽然现在有很多优秀的第三方 HTTP 客户端(如 OkHttp、Apache HttpClient),但在一些对依赖有严格限制的项目中,原生的 HttpURLConnection
依然是一个值得掌握的工具。特别是在不引入额外依赖的前提下,它能完成大多数基础的 HTTP 通信任务。
2. 使用 HttpURLConnection 构建 JSON POST 请求
下面我们将一步步构建一个完整的 JSON POST 请求流程。
2.1. 创建 URL 对象
首先,我们需要一个目标 URL,它将接收我们发送的 JSON 数据:
URL url = new URL("https://reqres.in/api/users");
这里我们使用的是 reqres.in 提供的测试接口,方便调试。
2.2. 打开连接
通过 URL 对象调用 openConnection()
方法获取 HttpURLConnection
实例:
HttpURLConnection con = (HttpURLConnection) url.openConnection();
⚠️ 注意:HttpURLConnection
是一个抽象类,不能直接实例化,必须通过 URL.openConnection()
获取。
2.3. 设置请求方法
我们要发送的是 POST 请求,因此需要设置请求方法为 "POST"
:
con.setRequestMethod("POST");
2.4. 设置请求头 Content-Type
为了告诉服务器我们发送的是 JSON 格式的数据,需要设置 Content-Type
请求头为 application/json
:
con.setRequestProperty("Content-Type", "application/json");
❌ 如果不设置这个头,服务器可能会返回 400 Bad Request
错误。
2.5. 设置响应格式 Accept 头
为了让服务器知道我们希望接收 JSON 格式的响应内容,可以设置 Accept
请求头:
con.setRequestProperty("Accept", "application/json");
虽然不是必须的,但这是个好习惯,特别是在 API 接口支持多种响应格式时。
2.6. 启用输出流
为了让 HttpURLConnection
能够发送请求体,我们需要启用输出流:
con.setDoOutput(true);
✅ 如果不设置为 true
,在尝试写入数据时会抛出异常。
2.7. 构造请求体
我们构造一个简单的 JSON 字符串作为请求体:
String jsonInputString = "{\"name\": \"Upendra\", \"job\": \"Programmer\"}";
然后通过输出流向服务器发送该 JSON 数据:
try (OutputStream os = con.getOutputStream()) {
byte[] input = jsonInputString.getBytes("utf-8");
os.write(input, 0, input.length);
}
2.8. 读取响应内容
请求发送完成后,我们需要读取服务器的响应内容。使用 getInputStream()
获取输入流,并读取响应数据:
try (BufferedReader br = new BufferedReader(
new InputStreamReader(con.getInputStream(), "utf-8"))) {
StringBuilder response = new StringBuilder();
String responseLine = null;
while ((responseLine = br.readLine()) != null) {
response.append(responseLine.trim());
}
System.out.println(response.toString());
}
如果响应内容是 JSON 格式,建议使用 Jackson、Gson 或 org.json 等第三方库进行解析处理。
3. 总结
本文介绍了如何使用 HttpURLConnection
发送一个包含 JSON 数据的 POST 请求。虽然原生 API 写起来略显繁琐,但在不引入第三方库的场景下,它是 Java 标准库中处理 HTTP 请求的有效工具。
对于更复杂的场景(如上传文件、处理 cookies、连接池管理等),建议还是使用更现代的 HTTP 客户端库来提升开发效率和代码可维护性。