@RequestParam和@RequestBody的使用
0. 前言
发现一篇讲@RequestParam
和@RequestBody
的区别的文章,感觉写的挺好。
在编写项目的过程中,老出现前后端传递参数格式不一致、不统一的问题,
@RequestParam
和@RequestBody
的区别,避免大家遭遇同等错误;
1. @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.1 @RequestParam
总体上来说,该注解类拥有三个参数:
value
、name
属性都标识请求参数名(必须配置);required
:参数是否必传,默认为true
,可以设置为非必传false
;(如果设置了必传或默认,请求未传递参数,将会抛出异常);defaultValue
:参数默认值,如果设置了该值,required 将会自动设置为 false;
1.2 @RequestParam
注解获取的参数放在请求体的哪个部分?
get
请求的requestHeaders
中content-type
这个字段,使用form-data
表单形式携带参数请求;Spring
中的@RequestParam
注解接收的参数大多数场景是来自requestHeaders
中,即请求头,也就是url
中,格式为:http://localhost:8080?name=yc&age=23
,由于url
长度有限制,所以参数需要限制数量
和值得长度
;
1.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
1.4 使用场景:
请求是为了查找资源,获取服务器数据;
请求结果无持续性的副作用,例如:不会对数据库进行添加、修改、删除操作;
传入的参数不会太长,因为
Get
请求可能会产生很长的URL
,或许会超过某些浏览器与服务器对URL
的长度限制,导致请求失败;
2. @RequestBody
注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {/*** 默认参数必传*/boolean required() default true;}
2.1 @RequestBody
注解只拥有一个参数:
required
默认为 true
,即对象中的属性必须有一个要传,否则会抛出异常:org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing
2.2 @RequestBody
注解获取的参数在请求哪?
post
请求的requestHeaders
请求头中有content-type
字段,一般用来处理:applicatin/json
格式的参数;Spring
中的@RequestBody
注解是用来接收请求体
中的参数数据,即requestBody
请求体中,故不受参数数据长度的限制;
2.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
2.4 使用场景:
请求的结果有持续性作用,例如:对数据库添加、更新、删除操作;
若使用Get请求,表单参数过长;
要传送的数据不是采用7位的ASCII编码;
3. 使用Post
请求,@RequestParam
也可以接收参数;
注意:
也可以使用这种方式用,发送Post
请求,参数拼接到url
之后,这是因为协议之间没有做严格的区分,但这种方式不建议使用,这种方式就使用Get
方式即可。例如:localhost:8888/optimus-prime/project/test?id=1&name=yc&age=23
使用浏览器请求数据,这种方式Get请求,但后端使用Post方式接收,访问不成功!
执行代码:
@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
4. 额外知识1:
Http
协议常用的四种请求方式:Post、Get、Put、Delete
等;其中Put、Delete
请求方式很少见,都可用Post
方式代替!
对数据库而言:
get
请求不修改数据库,只是查询。Post
是增加记录,put
是更新,Delete
数据库删除;Put,Post,Delete
方式的请求参数会直接放在requestBody
里;处理
request uri
部分的注解,路径参数变量:@PathVariable
;处理
request header
部分的注解:@RequestHeader, @CookieValue,@RequestParam
;处理
request body
部分的注解:@RequestParam, @RequestBody
;
综上所述:
@RequestParam
注解既可以接收Get
方式的请求头中的参数,也可以接收Post
方式的请求体中的参数;
5. 额外知识2:
get
请求的 headers
中没有 content-type
这个字段,post
的 content-type
有 :
application/x-www-form-urlencoded
这种就是一般的文本表单用post
传地数据,只要将得到的data
用@RequestParam
或request.getParamter()
获取即可;multipart/form-data
,用于文件上传,此时form
的enctype
属性必须指定为multipart/form-data
;application/json
,将数据以json
对象的格式传递;text/xml
;put
和delete
请求的headers
是有content-type
这个字段的,只不过这两个方法类型目前不常用;
@RequestParam和@RequestBody的使用相关推荐
- postbody传参_post传参params与body的区别(@RequestParam和@RequestBody的区别)
1.axios post请求 Content-Type默认为 application/x-www-form-urlencoded,我们传递参数的时,params里面的参数(简单的对象,通过 &quo ...
- @RequestParam和@RequestBody的区别 (结合 Get/Post )
一.get方法 请求:例如http://127.0.01:1025/download?url=https://www.baidu.com&token=opera-dev 获取请求参数: 直接获 ...
- HttpServletRequest和@Requestparam、@RequestBody、直接实体接收请求参数的区别与示例
文章目录 概述 1.HttpServletRequest 2.@RequestParam 3.@RequestBody 4.直接实体接收 HttpServletRequest请求方法详解: 概述 客户 ...
- 获取后端接口请求中的参数(@PathVariable,@RequestParam,@RequestBody区别,使用postman请求
获取参数 SpringBoot提供的获取参数注解包括:@PathVariable,@RequestParam,@RequestBody,三者的区别如下表: 一:后端接口什么都不加 postman请求后 ...
- 重点:@RequestMapping(含参数详解)和@RequestParam、@RequestBody、@PathVariable、@RequestHeader
@RequestMapping注解 @RequestMapping是一个用来处理请求地址到处理器controller功能方法映射规则的注解,这个注解会将 HTTP 请求映射到 MVC 和 REST 控 ...
- @RequestParam和@RequestBody
1.@RequestParam作用场景: 当前端传到后台时,后台接收的参数名和前台传递的参数名一致: 比如:正常情况下, jsp:<a href="param/testRequestP ...
- SpringMvc @RequestParam、 @RequestBody、@RequestPart 的区别
注解@RequestParam接收的参数是来自requestHeader中,即请求头. RequestParam可以接受简单类型的属性,也可以接受对象类型. @RequestParam有三个配置参数: ...
- @PathVariable、@RequestParam、@RequestBody注解
讲解更加详细的参考资料 https://blog.csdn.net/u011410529/article/details/66974974 https://www.cnblogs.com/soul-w ...
- 浅谈@RequestParam与@RequestBody区别
@RequestParam:与servlet的request.getParameter()用法一致,都是用来接收form表单的提交,默认是application/x-www-form-urlencod ...
最新文章
- 【译】用Fragment创建动态的界面布局(附Android示例代码)
- 缓冲区溢出-基本ROP-ret2syscall
- 15家大数据公司被调查,数据行业面临大清洗?
- ansible-01
- 【竞赛】智能算法赛:智慧海洋建设Top1方案代码
- 配置Git服務器和Windows客戶端
- 部署webservice到远程服务器
- 【BZOJ 1098】办公楼(补图连通块个数,Bfs)
- idea首次创建新模块的详细操作
- 设置其他用户文件、文件夹权限与现用户权限相同(命令、权限)
- lnk2019 mysql_C++使用MySQL-Connector/C++连接MySQL出现LNK2019错误的解决方法
- python安装详细步骤mac_Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
- linux系统VNC安装包下载,CentOS 7 安装VNC 和 KVM
- java实现文件对比
- 时间去哪儿了?--读《时间简史》有感
- MySQL添加新用户、创建数据库、为新用户分配权限、收回权限
- 21条黄金法则,全面提升你的领导力
- 阶梯博弈(Staircase Nim)
- 射频百科 | 限幅器的使用指南
- .NET 请求被挂起,前端轮询,委托