杰瑞科技汇

Java中如何发送HTTP POST请求?

  1. 使用 HttpURLConnection (JDK 内置) - 最基础,无需额外依赖,但代码较繁琐。
  2. 使用 HttpClient (Java 11+ 内置) - 现代、官方推荐,功能强大且易用。
  3. 使用第三方库 OkHttp (流行且强大) - 社区广泛使用,功能非常丰富。

准备工作:创建一个用于测试的 API 服务

为了演示 POST 请求,我们需要一个能接收请求并返回响应的 API,你可以使用一个在线的测试工具,httpbin.org

Java中如何发送HTTP POST请求?-图1
(图片来源网络,侵删)

它提供了一个非常方便的 POST 接口:https://httpbin.org/post,当你向它发送 POST 请求时,它会返回你发送的请求头、请求体等信息,非常适合调试和学习。


使用 HttpURLConnection (JDK 内置)

这是 Java 标准库自带的,不需要添加任何依赖,它的 API 比较老旧,代码量较多,手动处理流、编码等也比较麻烦。

示例代码

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
public class PostWithHttpURLConnection {
    public static void main(String[] args) throws Exception {
        // 1. 目标 URL
        String urlString = "https://httpbin.org/post";
        URL url = new URL(urlString);
        // 2. 打开连接
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "application/json; utf-8");
        connection.setRequestProperty("Accept", "application/json");
        connection.setDoOutput(true); // 允许发送请求体
        // 3. 准备要发送的 JSON 数据
        String jsonInputString = "{\"name\": \"John Doe\", \"job\": \"Software Engineer\"}";
        // 4. 发送请求体
        try (DataOutputStream out = new DataOutputStream(connection.getOutputStream())) {
            out.write(jsonInputString.getBytes(StandardCharsets.UTF_8));
            out.flush();
        }
        // 5. 获取响应码
        int responseCode = connection.getResponseCode();
        System.out.println("POST Response Code : " + responseCode);
        // 6. 读取响应内容
        StringBuilder response = new StringBuilder();
        if (responseCode == HttpURLConnection.HTTP_OK) { // 200
            try (BufferedReader in = new BufferedReader(
                    new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {
                String inputLine;
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
            }
            System.out.println("Response body: " + response.toString());
        } else {
            System.out.println("POST request did not work.");
        }
    }
}

优缺点:

  • 优点: 无需任何外部库,是 Java 的标准功能。
  • 缺点: 代码冗长,需要手动处理很多细节(如流、编码、错误码等),不推荐在新项目中使用。

使用 HttpClient (Java 11+ 推荐)

从 Java 11 开始,java.net.http 包被引入,提供了现代化的 HttpClient API,这是目前官方推荐的方式,代码简洁,支持异步请求,功能强大。

Java中如何发送HTTP POST请求?-图2
(图片来源网络,侵删)

示例代码

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class PostWithHttpClient {
    public static void main(String[] args) throws Exception {
        // 1. 创建 HttpClient
        HttpClient client = HttpClient.newBuilder()
                .version(HttpClient.Version.HTTP_2)
                .connectTimeout(Duration.ofSeconds(10))
                .build();
        // 2. 准备要发送的 JSON 数据
        String jsonBody = "{\"name\": \"Jane Doe\", \"job\": \"Project Manager\"}";
        // 3. 创建 HttpRequest
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://httpbin.org/post"))
                .header("Content-Type", "application/json")
                .timeout(Duration.ofSeconds(5))
                .POST(HttpRequest.BodyPublishers.ofString(jsonBody))
                .build();
        // 4. 发送请求并获取响应
        // 同步发送
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        // 5. 处理响应
        System.out.println("Status Code: " + response.statusCode());
        System.out.println("Response Body: " + response.body());
    }
}

优缺点:

  • 优点: 现代、简洁、功能强大(内置支持异步、WebSocket),是 Java 的官方标准。
  • 缺点: 需要 Java 11 或更高版本。

使用 OkHttp (第三方库)

OkHttp 是一个由 Square 公司维护的开源项目,是目前 Java 生态中最流行的 HTTP 客户端之一,它非常高效,易于使用,并且提供了丰富的功能。

添加依赖

你需要在你的项目中添加 OkHttp 的依赖。

Maven (pom.xml):

Java中如何发送HTTP POST请求?-图3
(图片来源网络,侵删)
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.12.0</version> <!-- 请使用最新版本 -->
</dependency>

Gradle (build.gradle):

implementation 'com.squareup.okhttp3:okhttp:4.12.0' // 请使用最新版本

示例代码

import okhttp3.*;
import java.io.IOException;
public class PostWithOkHttp {
    public static void main(String[] args) {
        // 1. 创建 OkHttpClient 实例
        OkHttpClient client = new OkHttpClient();
        // 2. 准备要发送的 JSON 数据
        String jsonBody = "{\"name\": \"Peter Jones\", \"job\": \"Data Scientist\"}";
        // 3. 创建 RequestBody
        MediaType JSON = MediaType.get("application/json; charset=utf-8");
        RequestBody body = RequestBody.create(jsonBody, JSON);
        // 4. 创建 Request
        Request request = new Request.Builder()
                .url("https://httpbin.org/post")
                .post(body)
                .build();
        // 5. 发送请求并获取响应
        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }
            // 获取响应体
            String responseBody = response.body().string();
            System.out.println("Status Code: " + response.code());
            System.out.println("Response Body: " + responseBody);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

优缺点:

  • 优点: API 非常直观易用,性能优异,社区活跃,插件丰富(如支持拦截器)。
  • 缺点: 需要引入第三方库。

总结与对比

特性 HttpURLConnection HttpClient (Java 11+) OkHttp
依赖 无需,JDK 内置 无需,JDK 11+ 内置 需要添加 okhttp 依赖
易用性 差,代码繁琐 ,API 现代 非常好,API 简洁直观
功能 基础 强大,支持异步/同步 非常强大,支持拦截器、重试、连接池等
性能 一般 非常高
推荐场景 旧项目、无法引入依赖的极简环境 新项目的首选,尤其是 Java 11+ 环境 需要高级功能(如拦截器)或追求极致易用性的项目

如何选择?

  • 如果你使用 Java 11 或更高版本,并且是开发新项目强烈推荐使用 HttpClient,它是未来的方向,无需额外依赖,且功能足够强大。
  • 如果你使用的是 Java 11 以下的版本,或者项目已经广泛使用了 OkHttp:继续使用 OkHttp 是一个非常好的选择,它的生态和易用性都无懈可击。
  • 如果你在一个非常受限的环境(如某些嵌入式系统)中,无法添加任何库:那么只能使用 HttpURLConnection,但请做好处理繁琐代码的准备。
分享:
扫描分享到社交APP
上一篇
下一篇