一、前言
一直有这么一个疑问:在使用postman工具测试api接口的时候,如何使用 json 字符串传值呢,而不是使用 x-www-form-urlencoded 类型,毕竟通过 key-value 传值是有局限性的。假如我要测试批量插入数据的接口呢,使用 x-www-form-urlencoded 方法根本就不适用于这种场景。

那么如何通过postman工具使用json字符串传值呢,这里就引申出来了spring的两个注解:

  • @RequestParam
  • @RequestBody

总而言之,这两个注解都可以在后台接收参数,但是使用场景不一样。继续往下看 ↓

二、@RequestParam
先介绍一下@RequestParam的使用场景:

注解@RequestParam接收的参数是来自requestHeader中,即请求头。通常用于GET请求,比如常见的url:http://localhost:8081/spring-boot-study/novel/findByAuthorAndType?author=唐家三少&type=已完结,其在Controller 层的写法如下图所示:

@RequestParam有三个配置参数:

required 表示是否必须,默认为 true,必须。
defaultValue 可设置请求参数的默认值。
value 为接收url的参数名(相当于key值)。
@RequestParam用来处理 Content-Type 为 application/x-www-form-urlencoded 编码的内容,Content-Type默认为该属性。

@RequestParam也可用于其它类型的请求,例如:POST、DELETE等请求。比如向表中插入单条数据,Controller 层的写法如下图所示:

由于@RequestParam是用来处理 Content-Type 为 application/x-www-form-urlencoded 编码的内容的,所以在postman中,要选择body的类型为 x-www-form-urlencoded,这样在headers中就自动变为了 Content-Type : application/x-www-form-urlencoded 编码格式。如下图所示:


但是这样不支持批量插入数据啊,如果改用 json 字符串来传值的话,类型设置为 application/json,点击发送的话,会报错,后台接收不到值,为 null。

这时候,注解@RequestBody就派上用场了。

三、@RequestBody

先介绍一下@RequestBody的使用场景:

注解@RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:application/json、application/xml等类型的数据。

就application/json类型的数据而言,使用注解@RequestBody可以将body里面所有的json数据传到后端,后端再进行解析。

3.1 向表中批量插入数据
举个批量插入数据的例子,Controller层的写法如下图所示:


由于@RequestBody可用来处理 Content-Type 为 application/json 编码的内容,所以在postman中,选择body的类型为row -> JSON(application/json),这样在 Headers 中也会自动变为 Content-Type : application/json 编码格式。body内的数据如下图所示:

批量向表中插入两条数据,这里的 saveBatchNovel()方法已经封装了 JPA的 saveAll() 方法。body 里面的 json 语句的 key 值要与后端实体类的属性一一对应。

注意:前端使用$.ajax的话,一定要指定 contentType: “application/json;charset=utf-8;”,默认为 application/x-www-form-urlencoded。

3.2 后端解析json数据
上述示例是传递到实体类中的具体写法,那么如果传递到非实体类中,body里面的json数据需要怎么解析呢?我们再来看下面这个例子:

在body中,我们还是输入上面的json数据,根据分析,上面的json数据是一个List数组内嵌套着map对象,那么在后台的接收形式可写为 List<Map<String, String>>,具体代码如下图所示:



控制台输出:


四、总结
注解@RequestParam接收的参数是来自requestHeader中,即请求头。通常用于GET请求,像POST、DELETE等其它类型的请求也可以使用。

注解@RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:application/json、application/xml等类型的数据。通常用于接收POST、DELETE等类型的请求数据,GET类型也可以适用。

**重点补充:**在使用注解@RequestParam的时候【不加注解的时候效果与@RequestParam类似】,在body data中我们不能传json字符串类型的参数,否则对象中是接收不到传递参数相应的值。相应的在@RequestBody注解标记的形式上传递表格参数则会报错。

postman模拟发送请求【@RequestParam接受json字符串】:

debug断点后页面展示的结果:

postman模拟发送请求【@RequestBody接受application/x-www-form-urlencoded表格参数】:


代码以及报错显示:

注解@RequestParam【不添加默认项注解】与@RequestBody的使用场景相关推荐

  1. SpringMVC注解@RequestParam全面解析____ 注解@RequestParam如何使用加与不加的区别

    SpringMVC注解@RequestParam全面解析 在此之前,写项目一直用的是@RequestParam(value="aa" required=false)这个注解,但是并 ...

  2. @RequestBody、 @RequestParam 、 @PathVariable 和 @Vaild 注解

    后端接收前端传的参数主要有两种方式: 第一种: 用变量来接收,前端传递的参数会对相同变量名进行赋值. 第(1)种: @GetMapping("/info/{id}")public ...

  3. @RequestBody、 @RequestParam 、 @PathVariable 和 @Vaild 注解的使用及区别

    @RequestBody @RequestBody 主要用来接收前端传递给后端的 json 字符串中的数据(请求体中的数据): Get 方式无请求体,所以使用 @RequestBody 接收数据时,前 ...

  4. SpringMVC全局乱码过滤器、注解@RequestParam、自定义类型转换器

    目录 配置全局乱码过滤器 参数绑定注解@RequestParam 注解@RequestParam的参数使用说明 获得Restful风格的参数 自定义类型转换器 自定义转换器的开发步骤: 获得Servl ...

  5. SpringMVC注解@RequestParam全面解析

    在SpringMVC后台控制层获取参数的方式主要有两种,一种是request.getParameter("name"),另外一种是用注解@RequestParam直接获取.这里主要 ...

  6. 使用RunWith注解改变JUnit的默认执行类,并实现自已的Listener

    2019独角兽企业重金招聘Python工程师标准>>> 使用RunWith注解改变JUnit的默认执行类,并实现自已的Listener在平时的单元测试,如果不使用RunWith注解, ...

  7. 修改Visual Studio中“添加新项”时默认添加的命名空间

    最近要修改一个以前开发的项目,项目中并没有运用Linq,但是我在VS2008中添加新项都会自动添加Linq命名空间,每次都要手动去删除很麻烦,就想想有没有办法可以修改这个"添加新项" ...

  8. spring页面使用注解@RequestParam把请求参数封装到map中

    spring页面请求参数封装到map中 1.使用注解@RequestParam : /*** 查询全部[对应企业的全部]* @return*/@RequestMapping(value="/ ...

  9. java ssm常用注解_SSM框架中常用的注解

    @Controller:在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model , ...

最新文章

  1. oracle win10家庭版,Windows10远程报错:由于CredSSP加密Oracle修正(ps:Win10家庭版)
  2. Sharepoint学习笔记 –架构系列—Sharepoint的客户端对象模型(Client Object Model)
  3. WPF ControlTemplate TemplateBinding
  4. c++ 线程池_JAVA并发编程:线程池ThreadPoolExecutor源码分析
  5. OPPO Reno配置曝光 骁龙855+10倍混合光学变焦
  6. Python 打印日志
  7. Matlab聚类分析(Kmeans)
  8. USB协议分析方法,工具推荐
  9. Python + Graphviz 绘制神经网络结构图
  10. 明尼苏达大学计算机工程,关于美国明尼苏达大学电气与计算机工程系洪明毅博后学术报告的通知...
  11. 20【材料】相关专业调剂信息!一直更新!
  12. 大型系统存储层迁移实践
  13. 机器学习模型的评价指标和方法(附代码)
  14. 宝典:10分钟46个细节看透男人心(zt)
  15. 敏捷思维:要么双赢,要么别干
  16. 第一章:1-03、试从多个方面比较电路交换、报文交换和分组交换的主要优缺点。...
  17. 网站建设(一)PHP深入学习
  18. Java for语句详解
  19. 冯大辉Twitter每日推荐一位推友计划推友列表
  20. 大宋王朝王国的命运——何辉著

热门文章

  1. 执行 link.exe 时出错_在20多岁时应该做什么,以避免在30多岁和40多岁时后悔?...
  2. django的web开发笔记1(智能诊断系统数据概览记录)
  3. [转载] Java之继承
  4. javascript原型_使用JavaScript的示例报告卡Web应用程序原型
  5. python整数转换字符串_Python | 将字符串转换为整数列表
  6. 两个矩阵相乘的乘法次数_C ++程序将两个数字相乘而不使用乘法运算符
  7. 玩转Nacos参数配置!多图勿点
  8. 实战:布隆过滤器安装与使用及原理分析
  9. NHibernate使用之详细图解
  10. 程序设计竞赛资源索引