如何使用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
相关产品推荐
相关产品推荐

