Java发送JSON请求的简易教程
本文深入探讨了在Java中发送JSON请求的多种方法,并着重强调了正确设置`Content-Type`的重要性,它是服务器正确解析请求体的关键。文章首先介绍了使用`HttpURLConnection`发送POST请求并携带JSON数据的基本步骤,包括设置请求方法、内容类型以及写入JSON数据。随后,对比了`HttpURLConnection`的优缺点,并引出了`Apache HttpClient`、`OkHttp`以及`Spring RestTemplate/WebClient`等更高级的HTTP客户端库。此外,文章还详细阐述了如何优雅地处理HTTP请求中的异常和响应,强调了HTTP状态码的重要性以及如何从错误流中获取详细的错误信息,同时建议进行充分的日志记录。最后,针对不同的项目需求和技术栈,为开发者选择合适的Java HTTP客户端库提供了建议,助力构建健壮且高效的应用程序。
在Java中发送带JSON体的请求,通常使用HttpURLConnection或第三方库实现。首先,connection.setRequestMethod("POST")设置请求方法为POST;其次,connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8")设置内容类型为JSON并指定字符集;然后,connection.setDoOutput(true)允许输出流以写入请求体;最后通过connection.getOutputStream()获取输出流并写入JSON数据。除了HttpURLConnection,还可以选择Apache HttpClient(功能丰富、适合复杂场景)、OkHttp(高性能、适合轻量级服务)、Spring RestTemplate/WebClient(适合Spring项目、提供高层次抽象)。正确设置Content-Type是关键,用于告知服务器请求体的格式和编码,否则可能导致解析失败。处理响应时应结合HTTP状态码判断成功与否,并优先读取错误流以获取详细错误信息。异常处理和日志记录也是构建健壮HTTP请求的重要部分。
Java中发送带JSON体的请求,通常意味着你需要构建一个HTTP POST请求,并将JSON格式的数据作为请求体发送出去。这主要涉及到设置正确的请求头,特别是Content-Type
为application/json
,然后将JSON字符串写入连接的输出流。

解决方案
在我看来,处理HTTP请求,尤其是涉及请求体这种细节,Java内置的HttpURLConnection
是个不错的起点,虽然它可能显得有些原始,但胜在无需额外依赖。当然,更现代的库会提供更优雅的API,但原理是相通的。
以下是一个使用HttpURLConnection
发送带JSON体的POST请求的示例:

import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; public class JsonPostRequestSender { public static void main(String[] args) { String targetUrl = "http://localhost:8080/api/data"; // 替换为你的目标API地址 String jsonPayload = "{\"name\": \"Alice\", \"age\": 30, \"city\": \"New York\"}"; try { String response = sendPostRequestWithJson(targetUrl, jsonPayload); System.out.println("Response from server:\n" + response); } catch (IOException e) { System.err.println("Error sending request: " + e.getMessage()); e.printStackTrace(); } } /** * 发送一个带JSON体的HTTP POST请求。 * * @param urlString 目标URL字符串。 * @param jsonBody 要发送的JSON字符串。 * @return 服务器的响应字符串。 * @throws IOException 如果发生网络或IO错误。 */ public static String sendPostRequestWithJson(String urlString, String jsonBody) throws IOException { URL url = new URL(urlString); HttpURLConnection connection = null; StringBuilder response = new StringBuilder(); try { connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); // 设置请求方法为POST connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); // 关键:设置内容类型为JSON,并指定字符集 connection.setRequestProperty("Accept", "application/json"); // 告诉服务器我们期望JSON响应 // 允许输出,即允许写入请求体 connection.setDoOutput(true); // 将JSON数据写入请求体 try (DataOutputStream wr = new DataOutputStream(connection.getOutputStream())) { byte[] postData = jsonBody.getBytes(StandardCharsets.UTF_8); wr.write(postData); wr.flush(); // 确保所有数据都已写入 } // 获取响应码 int responseCode = connection.getResponseCode(); System.out.println("HTTP Response Code: " + responseCode); // 根据响应码判断是读取正常输入流还是错误流 BufferedReader in; if (responseCode >= 200 && responseCode < 300) { in = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8)); } else { // 对于非2xx的响应,通常错误信息在错误流中 in = new BufferedReader(new InputStreamReader(connection.getErrorStream(), StandardCharsets.UTF_8)); } String inputLine; while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); // 关闭读取器 } finally { if (connection != null) { connection.disconnect(); // 确保关闭连接 } } return response.toString(); } }
这段代码的核心逻辑在于:
connection.setRequestMethod("POST");
: 明确告诉服务器这是一个POST请求。connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
: 这是最关键的一步。它告诉服务器,我发送的数据是JSON格式,并且编码是UTF-8。如果少了这一行,或者类型不对,服务器很可能无法正确解析你的请求体。connection.setDoOutput(true);
: 允许连接进行输出,这样我们才能把数据写入请求体。- 通过
connection.getOutputStream()
获取输出流,然后将JSON字符串转换为字节数组写入。我个人习惯用DataOutputStream
包装一下,感觉更稳妥。
理解HTTP Content-Type: application/json的重要性
说实话,刚开始接触Web开发时,我经常会忽略Content-Type
这个HTTP头,或者只是简单地设为text/plain
。结果就是,服务器端总是抱怨收到的数据格式不对,或者干脆解析失败。后来才明白,Content-Type
就像是数据传输的“说明书”,它明确告诉服务器请求体里的数据是什么类型,应该如何去解析。

具体到application/json
,它的作用就是声明请求体中的数据是符合JSON规范的文本。服务器收到这个头部后,就会知道应该使用JSON解析器来处理请求体,而不是尝试用表单解析器(application/x-www-form-urlencoded
)或者其他方式。如果这个头部设置错了,比如你发送的是JSON,但Content-Type
却是application/xml
,那么服务器的JSON解析器就不会被调用,你的请求很可能就会被拒绝或者解析出奇怪的结果。
有时候,你还会看到charset=UTF-8
这样的后缀。这也很重要,它指定了JSON字符串的字符编码。虽然JSON标准默认是UTF-8,但明确指定总是一个好习惯,可以避免跨平台或不同系统间因编码不一致导致的乱码问题。这在处理国际化数据时尤其关键。
优雅地处理Java HTTP请求中的异常和响应
在实际项目中,发送HTTP请求远不止“发出去”那么简单,更重要的是如何“安全地发出去”并“正确地处理回来”。异常处理和响应解析是健壮代码不可或缺的部分。
首先,try-catch-finally
结构是Java处理资源和异常的基石。在HTTP请求中,网络问题(如连接超时、主机不可达)会抛出IOException
,所以捕获它至关重要。我通常会把请求和响应流的操作都放在try
块里,确保资源(如HttpURLConnection
、InputStream
、OutputStream
)能在finally
块中被妥善关闭,避免资源泄露。
处理响应时,仅仅拿到服务器返回的字符串是不够的。HTTP状态码(connection.getResponseCode()
)提供了请求处理结果的第一手信息。2xx
系列(如200 OK, 201 Created)表示请求成功;4xx
系列(如400 Bad Request, 401 Unauthorized, 404 Not Found)表示客户端错误;5xx
系列(如500 Internal Server Error, 503 Service Unavailable)则表示服务器端错误。我的做法是,对于非2xx的响应码,我会优先从connection.getErrorStream()
读取响应体,因为那里通常包含了服务器返回的错误详情,这对于调试和问题定位非常有帮助。如果只从getInputStream()
读,可能会错过这些重要的错误信息。
此外,日志记录是不可或缺的。在捕获到异常时,或者收到非2xx响应时,详细地记录下错误信息、请求URL、请求体(敏感信息需要脱敏)、响应码以及响应体,这能极大地简化后期的问题排查。我个人习惯使用SLF4J配合Logback或Log4j2,它们提供了灵活的日志级别控制和输出配置。
除了HttpURLConnection,还有哪些主流的Java HTTP客户端库?
虽然HttpURLConnection
是Java标准库的一部分,无需额外依赖,但在实际的企业级开发中,我们往往会选择功能更强大、API更友好、性能更优的第三方库。这就像是,你可以用原始工具搭建一个房子,但有了电动工具和预制件,效率和质量会高得多。
Apache HttpClient: 这是一个非常成熟且功能丰富的HTTP客户端库。它提供了更高级的抽象,例如连接池管理、重试机制、身份验证、Cookie管理等。对于需要处理大量并发请求或复杂HTTP场景的应用来说,Apache HttpClient通常是首选。它的API设计也比
HttpURLConnection
更直观一些,例如,通过HttpPost
对象直接设置实体(Entity),而不用手动操作字节流。OkHttp: 由Square公司开发,以其高性能和易用性而闻名。OkHttp在Android开发中非常流行,但它也完全适用于后端服务。它支持HTTP/2和WebSocket,内置连接池、请求重试、拦截器等功能。它的链式调用API设计简洁明了,写起来非常流畅。我个人在处理一些轻量级服务间的通信时,经常会倾向于使用OkHttp,因为它既强大又不会带来太大的负担。
Spring RestTemplate / WebClient: 如果你的项目是基于Spring框架的,那么
RestTemplate
(Spring 5.x以后推荐使用WebClient
)无疑是最佳选择。它们是Spring对HTTP客户端的进一步封装,提供了非常高层次的抽象,可以直接将Java对象序列化为JSON(或XML)发送,并将响应反序列化为Java对象。RestTemplate
是同步阻塞的,而WebClient
则提供了非阻塞的响应式编程支持,非常适合构建高并发、低延迟的微服务应用。它们极大地简化了HTTP请求的构建和响应处理,让开发者可以更专注于业务逻辑。
选择哪个库,很大程度上取决于项目的具体需求、团队的技术栈以及对性能和开发效率的权衡。对于简单的脚本或不希望引入额外依赖的场景,HttpURLConnection
足够用;对于需要强大功能和良好性能的企业应用,Apache HttpClient或OkHttp是很好的选择;而对于Spring生态系统内的项目,RestTemplate
或WebClient
则能提供最无缝的集成体验。
好了,本文到此结束,带大家了解了《Java发送JSON请求的简易教程》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多文章知识!

- 上一篇
- 韩剧TV积分怎么领?新手必看攻略

- 下一篇
- Camtasia录屏技巧全解析
-
- 文章 · java教程 | 11分钟前 |
- Android发送JSON报错400怎么解决
- 429浏览 收藏
-
- 文章 · java教程 | 27分钟前 |
- VSCodeJava开发必备插件推荐
- 449浏览 收藏
-
- 文章 · java教程 | 37分钟前 |
- ELK技术栈处理海量日志方案解析
- 265浏览 收藏
-
- 文章 · java教程 | 39分钟前 |
- JavaARGB像素解码方法与应用
- 266浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- OracleSQL日期计算技巧与常见错误解析
- 248浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java调用Python脚本的多种方式对比
- 490浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- SpringBoot跨域问题解决指南
- 326浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- 提取数字字符的Java教程
- 151浏览 收藏
-
- 文章 · java教程 | 2小时前 |
- Java处理HTML邮件内容的实用技巧
- 236浏览 收藏
-
- 文章 · java教程 | 2小时前 |
- Java高效执行大量Linux命令的技巧
- 268浏览 收藏
-
- 文章 · java教程 | 2小时前 |
- Java垃圾回收算法对比与优化技巧
- 346浏览 收藏
-
- 文章 · java教程 | 3小时前 |
- Java异常处理技巧与常见错误解析
- 286浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 300次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 297次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 294次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 307次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 319次使用
-
- 提升Java功能开发效率的有力工具:微服务架构
- 2023-10-06 501浏览
-
- 掌握Java海康SDK二次开发的必备技巧
- 2023-10-01 501浏览
-
- 如何使用java实现桶排序算法
- 2023-10-03 501浏览
-
- Java开发实战经验:如何优化开发逻辑
- 2023-10-31 501浏览
-
- 如何使用Java中的Math.max()方法比较两个数的大小?
- 2023-11-18 501浏览