灵活运用的@RequestParam和@RequestBody
Posted blogtech
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了灵活运用的@RequestParam和@RequestBody相关的知识,希望对你有一定的参考价值。
最近在编写项目的过程中,老出现前后端传递参数格式不一致、不统一的问题,对于一个已经快工作一年的Java程序员来说,实属不合格,所以我就下来好好研究了一下@RequestParam和@RequestBody的区别,避免大家遭遇同等错误;
一 @RequestParam注解
@Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequestParam /** * 参数名称(和value同等意思) */ @AliasFor("name") String value() default ""; /** * 参数名称 (和name同等意思) */ @AliasFor("value") String name() default ""; /** * 是否必选(默认必选) */ boolean required() default true; /** * 参数默认值 */ String defaultValue() default ValueConstants.DEFAULT_NONE;
(1)@RequestParam总体上来说,该注解类拥有三个参数:
a)value、name 属性都标识请求参数名(必须配置);
b)required:参数是否必传,默认为 true,可以设置为非必传 false;(如果设置了必传或默认,请求未传递参数,将会抛出异常);
c)defaultValue:参数默认值,如果设置了该值,required 将会自动设置为 false;
(2)@RequestParam注解获取的参数放在请求哪?
a)get请求的 headers 中没有 content-type 这个字段,使用 form-data 表单形式携带参数请求;
b)Spring中的@RequestParam注解接收的参数是来自requestHeader中,即请求头,也就是url中,格式为:http://localhost:8080?name=yc&age=23,由于 url 长度有限制,所以参数需要限制数量和值得长度;
(3)如何使用:
使用一:利用Postman工具,使用form-data提交Get请求
执行代码:
@RequestMapping(value = "/test", method = RequestMethod.GET) public void test(@RequestParam("id") Integer id, @RequestParam("name") String name, @RequestParam("age") Integer age) log.info("id = , name = , age = ", id, name, age);
结果:
id = 1, name = yc, age = 23
使用二:不使用@RequestParam注解直接进行对象属性赋值(不推荐使用,容易和@ReuqestBody混淆)
代码执行:
@Data @AllArgsConstructor @NoArgsConstructor public class User private Integer id; private String name; private Integer age; @RequestMapping(value = "/test", method = RequestMethod.GET) public void test(User user) log.info("id = , name = , age = ", user.getId(), user.getName(), user.getAge());
结果:
id = 1, name = yc, age = 23
(4)使用场景:
a)请求是为了查找资源,获取服务器数据;
b)请求结果无持续性的副作用,例如:不会对数据库进行添加、修改、删除操作;
c)传入的参数不会太长,因为Get请求可能会产生很长的URL,或许会超过某些浏览器与服务器对URL的长度限制,导致请求失败;
二、@RequestBody注解
@Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequestBody /** * 默认参数必传 */ boolean required() default true;
(1)@RequestBody注解只拥有一个参数:
required 默认为 true,即对象中的属性必须有一个要传,否则会抛出异常:org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing
(2)@RequestBody注解获取的参数在请求哪?
a)post请求的requestHeaders请求头中有content-type字段,一般用来处理:applicatin/json格式的参数;
b)Spring中的@RequestBody注解是用来接收请求体中的参数数据,即requestBody请求体中,故不受参数数据长度的限制;
(3)如何使用?
使用Postman工具发送json格式的数据:
执行代码:
@Data @AllArgsConstructor @NoArgsConstructor public class User private Integer id; private String name; private Integer age; @RequestMapping(value = "/test", method = RequestMethod.POST) public void test(@RequestBody User user) log.info("id = , name = , age = ", user.getId(), user.getName(), user.getAge());
结果:
id = 1, name = yc, age = 23
(4)使用场景:
a)请求的结果有持续性作用,例如:对数据库添加、更新、删除操作;
b)若使用Get请求,表单参数过长;
c)要传送的数据不是采用7位的ASCII编码;
测试三:使用Post请求,@RequestParam也可以接收参数(这种方式不知道为啥也可以这样用,但是我不这样用,害怕混淆)
执行代码:
@PostMapping(value = "/test") public void test(@RequestParam("id") Integer id, @RequestParam("name") String name, @RequestParam("age") Integer age) log.info("id = , name = , age = ", id, name, age);
结果:
id = 1, name = yc, age = 12
每天进步一点点,开行!
以上是关于灵活运用的@RequestParam和@RequestBody的主要内容,如果未能解决你的问题,请参考以下文章
源码篇Spring MVC多种请求入参处理方式都在这了(@RequestParam@PathVariable@RequestBodyMapJavaModelRequest基础类型)