热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入理解@RequestBody及其应用

本文深入探讨了@RequestBody注解的使用场景及核心逻辑,包括其与@RequestParam的区别和结合使用的方法。文章前半部分介绍了基础知识,后半部分则详细分析了源码和重要结论。

提示:强烈建议阅读本文关于@RequestBody核心逻辑的源码分析及六个关键结论!前半部分内容为基础知识,可根据需要跳过。

声明:本文基于Spring Boot框架进行讲解。

基础知识概览:

@RequestBody主要用于接收前端通过POST方法发送的JSON数据(请求体中的数据)。GET请求由于没有请求体,因此不能使用@RequestBody接收数据。在同一接收方法中,@RequestBody和@RequestParam可以同时使用,但@RequestBody只能出现一次,而@RequestParam可以多次出现。

注意:每个请求仅有一个RequestBody,但可以有多个RequestParam。当同时使用@RequestParam和@RequestBody时,RequestParam可以接收普通元素、数组、集合、对象等。如果参数位于请求体中,需用@RequestBody接收;若不在请求体中,则用@RequestParam接收或省略注解。

如果参数前有@RequestParam注解,前端必须提供相应的名称(无论是否有值),否则请求将返回400错误。若未使用@RequestParam注解,前端可以提供也可以不提供相应名称,存在时自动匹配,不存在时请求仍可成功。

当后端参数为对象且使用@RequestBody修饰时,前端传递的JSON数据需满足以下条件:

  • 后端将HTTP输入流中的数据映射到目标类时,依据JSON中的键匹配实体类属性。如果键值对符合或可转换为目标类型,将调用setter方法赋值。
  • JSON中的值为空字符串时,后端对应属性为String类型则接收空字符串,为Integer、Double等数值类型则接收null。
  • JSON中的值为null时,后端接收到的也是null。
  • 若某参数无值,应确保JSON中不包含该字段,或确保其值为null或空字符串。

示例详解:

首先展示两个用于示例的实体类:User和Team。

@RequestBody直接接收前端传来的JSON数据示例:

后端Controller代码示例:

使用Postman进行测试:

@RequestBody接收简单对象示例:

后端Controller代码示例:

使用Postman进行测试:

@RequestBody接收复杂对象示例:

后端Controller代码示例:

使用Postman进行测试:

@RequestBody与@RequestParam同时使用示例:

后端Controller代码示例:

使用Postman进行测试:

@RequestBody接收请求体中的JSON数据,不加注解接收URL中的数据并组装为对象示例:

后端Controller代码示例:

使用Postman进行测试:

注意:如果后端方法参数前有@RequestParam注解,前端必须提供相应的字段,否则会报400错误;若无此注解,前端可选提供字段。

@RequestBody与前端JSON数据的匹配规则:

声明:根据不同的Content-Type,Spring MVC会选择不同的HttpMessageConverter实现进行数据转换。本文讨论的是前端以application/json类型传递JSON数据,后端使用@RequestBody接收的情况。

解析JSON数据的大致流程为:HTTP请求体信息被封装进UTF8StreamJsonParser中,然后通过BeanDeserializer类中的deserializeFromObject方法进行解析。

核心逻辑分析示例:

假设前端传递的JSON字符串为{"name1":"邓沙利文","age":123,"mot":"我是一只小小小小鸟~"},后端模型只有name和age属性。以下是deserializeFromObject方法的核心逻辑示例:

小技巧:指定模型属性对应的JSON键:

这里简要介绍如何使用@JsonAlias和@JsonProperty注解来指定模型属性对应的JSON键。更多细节请参考相关文档。

Controller中的测试类示例:

模型属性示例:

使用Postman进行测试:

全面结论:

结论①:@JsonAlias注解允许JSON中的特定键转换为模型的特定属性,但模型转JSON时,键名保持与属性名一致。

结论②:@JsonProperty注解不仅允许JSON中的特定键转换为模型的特定属性,而且模型转JSON时,键名也会转换为指定的名称。

结论③:@JsonAlias注解依赖于setter和getter方法,而@JsonProperty注解不依赖。

结论④:在不使用上述注解的情况下,默认键名与属性名匹配时大小写敏感。

结论⑤:若JSON中有多个相同键,转换为模型时,最后一个键的值会被保留。

结论⑥:后端@RequestBody注解对应的类在将HTTP输入流中的数据映射到目标类时,会根据JSON中的键匹配实体类属性,并调用setter方法赋值。

如有不当之处,欢迎指正

代码托管链接:https://github.com/JustryDeng...RequestBody...


推荐阅读
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • ASP.NET MVC中Area机制的实现与优化
    本文探讨了在ASP.NET MVC框架中,如何通过Area机制有效地组织和管理大规模应用程序的不同功能模块。通过合理的文件夹结构和命名规则,开发人员可以更高效地管理和扩展项目。 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 本文详细介绍了 iBatis.NET 中的 Iterate 元素,它用于遍历集合并重复生成每个项目的主体内容。通过该元素,可以实现类似于 foreach 的功能,尽管 iBatis.NET 并未直接提供 foreach 标签。 ... [详细]
  • 自 Node.js 6.3 版本起,调试功能已内置在核心模块中,无需额外安装 node-inspector 等工具。通过简单的命令即可启动调试模式,并利用 Chrome 浏览器进行高效的代码调试。 ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
  • 本文详细解析了Java中hashCode()和equals()方法的实现原理及其在哈希表结构中的应用,探讨了两者之间的关系及其实现时需要注意的问题。 ... [详细]
author-avatar
_______王晓
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有