You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Java向HTTP请求发送JSON对象并接收JSON格式响应

嘿,你这段代码已经摸到了Java发送JSON格式POST请求的核心啦!我来帮你把整个流程补全,顺便提一些容易踩坑的细节:

Java实现JSON格式POST请求与响应处理

1. 你的现有代码核心逻辑解析

先把你的代码贴出来,咱们一步步看:

CreditCardDetail creditCard = new CreditCardDetail("DummyPerson", "5433334344", 04, 2023, 567);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(creditCard);
HttpRequest request = HttpRequest.newBuilder().uri(URI.create(uri)) .POST(BodyPublishers.ofString(json)).build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());

这段代码已经完成了三个关键步骤:

  • 封装请求数据到CreditCardDetail对象
  • 用Jackson的ObjectMapper把对象序列化为JSON字符串
  • 构建POST请求并发送,拿到字符串格式的响应

不过还有几个关键部分可以完善,让整个流程更健壮。

2. 补全完整流程

2.1 初始化HttpClient

你代码里的client没展示初始化,Java 11+自带了HttpClient,直接创建就行:

HttpClient client = HttpClient.newHttpClient();

2.2 必须添加的请求头

一定要给请求加上Content-Type: application/json,否则服务端大概率无法正确解析你的JSON请求体:

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create(uri))
        .header("Content-Type", "application/json") // 这行很重要!
        .POST(HttpRequest.BodyPublishers.ofString(json))
        .build();

2.3 异常处理不能少

序列化和网络请求都可能出问题,得把异常捕获处理,避免程序直接崩掉:

  • 序列化可能抛出JsonProcessingException
  • 发送请求可能抛出IOException或InterruptedException

2.4 把响应JSON转回Java对象(可选)

如果需要把响应的JSON字符串转回对象,同样用ObjectMapper的readValue方法就行,前提是你有对应的响应类。

3. 完整可运行示例代码

把所有部分整合起来,给你一个完整的例子:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
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 CreditCardRequestHandler {
    public static void main(String[] args) {
        // 1. 创建请求数据对象(注意:整数别写0开头,会被当成八进制)
        CreditCardDetail creditCard = new CreditCardDetail("DummyPerson", "5433334344", 4, 2023, 567);
        ObjectMapper mapper = new ObjectMapper();
        String jsonPayload;

        try {
            // 2. 将对象序列化为JSON字符串
            jsonPayload = mapper.writeValueAsString(creditCard);
        } catch (JsonProcessingException e) {
            System.err.println("JSON序列化失败:" + e.getMessage());
            return;
        }

        // 3. 初始化HTTP客户端
        HttpClient httpClient = HttpClient.newHttpClient();
        String apiEndpoint = "https://your-target-api.com/submit"; // 替换成你的实际接口地址

        // 4. 构建POST请求
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(apiEndpoint))
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(jsonPayload))
                .build();

        try {
            // 5. 发送请求并接收响应
            HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());

            // 打印基础响应信息
            System.out.println("响应状态码:" + response.statusCode());
            System.out.println("响应体:" + response.body());

            // 6. (可选)把响应JSON转为Java对象
            // ApiResponse responseObj = mapper.readValue(response.body(), ApiResponse.class);
            // System.out.println("接口返回结果:" + responseObj.isSuccess() + " - " + responseObj.getMessage());
        } catch (IOException e) {
            System.err.println("网络请求失败:" + e.getMessage());
        } catch (InterruptedException e) {
            System.err.println("请求被中断:" + e.getMessage());
            Thread.currentThread().interrupt(); // 恢复线程中断状态
        }
    }

    // 你的CreditCardDetail类(需要提供getter,Jackson才能正确序列化)
    static class CreditCardDetail {
        private String cardHolderName;
        private String cardNumber;
        private int expiryMonth;
        private int expiryYear;
        private int cvv;

        public CreditCardDetail(String cardHolderName, String cardNumber, int expiryMonth, int expiryYear, int cvv) {
            this.cardHolderName = cardHolderName;
            this.cardNumber = cardNumber;
            this.expiryMonth = expiryMonth;
            this.expiryYear = expiryYear;
            this.cvv = cvv;
        }

        // Getter方法必须有!
        public String getCardHolderName() { return cardHolderName; }
        public String getCardNumber() { return cardNumber; }
        public int getExpiryMonth() { return expiryMonth; }
        public int getExpiryYear() { return expiryYear; }
        public int getCvv() { return cvv; }
    }

    // 示例响应类(根据你的实际接口返回结构调整)
    static class ApiResponse {
        private boolean success;
        private String message;

        // 无参构造器必须有(Jackson反序列化需要)
        public ApiResponse() {}

        // Getter和Setter
        public boolean isSuccess() { return success; }
        public void setSuccess(boolean success) { this.success = success; }
        public String getMessage() { return message; }
        public void setMessage(String message) { this.message = message; }
    }
}

4. 几个容易踩坑的点

  • 整数的0开头问题:你代码里的04会被Java当成八进制数,直接写4就好
  • Jackson依赖:确保你的项目里引入了Jackson的databind依赖(Maven/Gradle都可以加)
  • 响应状态码校验:别光拿响应体,记得先看状态码,比如200/201表示成功,4xx/5xx是错误
  • 线程中断处理:如果请求被中断,记得恢复线程的中断状态,避免后续逻辑出问题

内容的提问来源于stack exchange,提问作者dhinchak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 16:53:13