杰瑞科技汇

Java JSON Post请求如何发送与解析?

创建一个简单的 JSON 对象

为了演示,我们首先需要一个 Java 对象(POJO),它将被序列化为 JSON,我们还会使用一个在线的测试 API(https://httpbin.org/post),它会返回我们发送给它的请求体,方便我们验证。

Java JSON Post请求如何发送与解析?-图1
(图片来源网络,侵删)

假设我们要发送一个用户信息:

User.java

// 一个简单的 POJO (Plain Old Java Object)
public class User {
    private String name;
    private int age;
    private String[] hobbies;
    // 无参构造函数是必要的,很多库依赖它
    public User() {
    }
    public User(String name, int age, String[] hobbies) {
        this.name = name;
        this.age = age;
        this.hobbies = hobbies;
    }
    // Getters and Setters (必须要有)
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
    public String[] getHobbies() { return hobbies; }
    public void setHobbies(String[] hobbies) { this.hobbies = hobbies; }
    // (可选) 重写 toString() 方便打印和调试
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", hobbies=" + Arrays.toString(hobbies) +
                '}';
    }
}

使用 Java 11+ 的 HttpClient (推荐,现代标准)

从 Java 11 开始,java.net.http.HttpClient 成为官方标准,无需添加任何外部依赖,这是目前编写 Java HTTP 请求最推荐的方式。

特点:

Java JSON Post请求如何发送与解析?-图2
(图片来源网络,侵删)
  • 标准库:无需任何第三方库。
  • 异步支持:可以轻松实现异步请求。
  • 现代 API:API 设计简洁、易用。

步骤:

  1. 创建 HttpClient 实例。
  2. 创建请求体 (HttpRequest.BodyPublishers),将 JSON 字符串写入。
  3. 构建 HttpRequest,设置方法、URL 和请求头。
  4. 发送请求并获取响应。

代码示例:

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import com.fasterxml.jackson.databind.ObjectMapper; // 需要添加 Jackson 依赖
public class Java11HttpClientPost {
    public static void main(String[] args) {
        // 1. 创建 HttpClient
        HttpClient client = HttpClient.newBuilder()
                .version(HttpClient.Version.HTTP_2)
                .connectTimeout(Duration.ofSeconds(10))
                .build();
        // 2. 准备要发送的 JSON 数据 (使用 Jackson 将对象转为 JSON 字符串)
        User user = new User("张三", 30, new String[]{"编程", "阅读"});
        ObjectMapper mapper = new ObjectMapper();
        String jsonBody = null;
        try {
            jsonBody = mapper.writeValueAsString(user);
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }
        System.out.println("准备发送的 JSON: " + jsonBody);
        // 3. 创建 HttpRequest
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://httpbin.org/post"))
                .header("Content-Type", "application/json") // 设置内容类型为 JSON
                .timeout(Duration.ofSeconds(15))
                .POST(HttpRequest.BodyPublishers.ofString(jsonBody)) // 设置请求体
                .build();
        // 4. 发送请求并处理响应
        try {
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
            // 打印响应状态码
            System.out.println("响应状态码: " + response.statusCode());
            // 打印响应体 (httpbin.org 会返回我们发送的数据)
            System.out.println("响应体: " + response.body());
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

如何运行: 你需要在你的项目中添加 Jackson 依赖来处理 JSON 序列化,如果你使用 Maven,在 pom.xml 中添加:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 使用最新版本 -->
</dependency>

使用 Apache HttpClient (经典选择)

Apache HttpClient 是一个功能强大、历史悠久的库,在 Java 8 甚至更早的时代被广泛使用。

Java JSON Post请求如何发送与解析?-图3
(图片来源网络,侵删)

特点:

  • 功能强大:提供了比标准库更丰富的功能和更精细的控制。
  • 稳定可靠:经过长期验证,非常稳定。
  • 需要依赖:需要添加 org.apache.httpcomponents.client5 包。

代码示例:

import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.entity.StringEntity;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.ContentType;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ApacheHttpClientPost {
    public static void main(String[] args) {
        // 1. 创建 HttpClient
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            // 2. 准备 JSON 数据
            User user = new User("李四", 25, new String[]{"音乐", "旅行"});
            ObjectMapper mapper = new ObjectMapper();
            String jsonBody = mapper.writeValueAsString(user);
            System.out.println("准备发送的 JSON: " + jsonBody);
            // 3. 创建 HttpPost 请求
            HttpPost httpPost = new HttpPost("https://httpbin.org/post");
            httpPost.setHeader("Content-Type", "application/json");
            httpPost.setEntity(new StringEntity(jsonBody, ContentType.APPLICATION_JSON));
            // 4. 执行请求
            try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                // 5. 处理响应
                HttpEntity entity = response.getEntity();
                System.out.println("响应状态码: " + response.getCode());
                if (entity != null) {
                    String result = EntityUtils.toString(entity);
                    System.out.println("响应体: " + result);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

如何运行:pom.xml 中添加以下依赖:

<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.3</version> <!-- 使用最新版本 -->
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents.core5</groupId>
    <artifactId>httpcore5</artifactId>
    <version>5.2</version> <!-- 使用最新版本 -->
</dependency>
<!-- 同样需要 Jackson -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

使用 OkHttp (流行选择)

OkHttp 是另一个非常流行的 HTTP 客户端,以其高效和易用性著称,尤其在 Android 开发中是事实标准。

特点:

  • 高性能:支持 HTTP/2 和连接池。
  • 简洁的 API:代码可读性高。
  • 需要依赖:需要添加 com.squareup.okhttp3 包。

代码示例:

import okhttp3.*;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class OkHttpPost {
    public static void main(String[] args) {
        // 1. 创建 OkHttpClient
        OkHttpClient client = new OkHttpClient();
        // 2. 准备 JSON 数据
        User user = new User("王五", 28, new String[]{"游戏", "电影"});
        ObjectMapper mapper = new ObjectMapper();
        String jsonBody = null;
        try {
            jsonBody = mapper.writeValueAsString(user);
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }
        System.out.println("准备发送的 JSON: " + jsonBody);
        // 3. 创建 RequestBody
        MediaType JSON = MediaType.parse("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)
                .header("Content-Type", "application/json")
                .build();
        // 5. 发送请求并处理响应
        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }
            // 打印响应状态码
            System.out.println("响应状态码: " + response.code());
            // 打印响应体
            System.out.println("响应体: " + response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如何运行:pom.xml 中添加以下依赖:

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.12.0</version> <!-- 使用最新版本 -->
</dependency>
<!-- 同样需要 Jackson -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

总结与选择

特性 Java 11+ HttpClient Apache HttpClient OkHttp
依赖 无需(JDK 自带) 需要 需要
易用性 中等
功能 丰富(支持异步) 非常丰富 丰富(性能好)
性能 良好 良好 优秀(连接池)
推荐场景 新项目,使用 Java 11+ 遗留项目,或需要精细控制 Android 项目,或追求高性能和简洁 API

如何选择?

  • 如果你使用的是 Java 11 或更高版本强烈推荐使用 HttpClient,它是未来的方向,无需额外依赖,API 设计也很现代。
  • 如果你在维护一个旧项目:并且已经在使用 Apache HttpClient,那么继续使用它是合理的,因为它非常稳定。
  • 如果你在开发 Android 应用OkHttp 是不二之选,因为它在 Android 生态中被深度集成和优化。
  • 如果你开始一个新项目,但不想用 Java 11+ 的特性OkHttp 是一个非常好的选择,它的 API 非常直观,性能也很好。

无论选择哪种方法,核心步骤都是一样的:

  1. 准备 JSON 数据 (通常用 Jackson/Gson 序列化 Java 对象)。
  2. 创建 HTTP 客户端
  3. 构建 POST 请求,设置 URL、Content-Type 头和包含 JSON 的请求体。
  4. 发送请求并解析响应
分享:
扫描分享到社交APP
上一篇
下一篇