@RequestBody和@RequestParam的使用

2022-10-31 12:29:36

@RequestBody
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

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

GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。

POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用HandlerAdapter 配置来解析HttpEntity中的数据,然后绑定到相应的bean上。

如果前端向后端传递的是非实体类对象,后台也可以使用@RequestBody注解,那就用List<Map<String, String>>来接收

@RequestParam
用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)

POST类型和GET类型都可以使用@RequestParam注解来接收参数

@RequestParam注解有三个参数

required 表示是否必须,默认为 true,必须。

defaultValue 可设置请求参数的默认值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值。

value 为接收url的参数名(相当于key值)。

举例:

//一下两种写法效果一模一样
@RequestParam("") 或 @RequestParam(value="")

//当配置多个属性的时候
@RequestParam(value="", required=true, defaultValue="")
    
//如果使用下面这种方式接值,那么前台穿过来的参数名称就要和inputStr一样,这里才能接收到
@RequestParam String inputStr
    
//但是如果加上value属性的话,那么前台传过来的参数名称就要和value属性中的一致才能接收到
@RequestParam(value="aa") String inputStr  
    
//如果加上required属性,当required=true就是必须要传参值过来, 当required=false表示不传的话,会给参数赋值为null
@RequestParam(value="aa", required=true)

//有一种特殊情况是参数为int类型时,设置required=false后参数不传值得话会给int类型参数赋值为null,而int是基本数据类型不能赋值为null,所以会报错,此时要将int类型改为Integer类型
@RequestParam(value="inputInt", required=false) int inputInt

@RequestParam接收对象类型
这里举个栗子

实体类是People属性如下

private String name; //姓名
private int age; //年龄
private String sex;  //性别

前台代码(拿JSP举例)

<input type="text" value="黑黑" name="name">
<input type="text" value="18"  name="age">
<input type="text" value="男"  name="sex">

后台代码

int addPeople(@RequestParam People people) {}
//这时候使用@RequestParam注解修饰参数 只要前台传的参数名称和people类中的属性名一致就可以自动封装进People实体类

这里我又想到一个问题,加和不加@RequestParam参数有什么区别呢?
其实不加@RequestParam参数也没问题(此时的参数名称要和前台传过来的参数名称保持一致),也可以接收到前台传过来的参数,当前台没有传值时接收到的为null,只不过使用@RequestParam是为了用它里面的一些属性,比如默认值或required属性。

总结
Post请求接收@RequestBody修饰的参数和@RequestParam修饰的参数,而Get请求则只能接收@RequestParam修饰的参数。
如果前端传的是Json类型的对象,后台就要使用@RequestBody修饰的实体类接收,如果是单个属性就使用@RequestParam修饰的变量或实体类接收

  • 作者:今昔在
  • 原文链接:https://blog.csdn.net/weixin_45336946/article/details/124044488
    更新时间:2022-10-31 12:29:36