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总体上来说,该注解类拥有三个参数:

  • valuename 属性都标识请求参数名(必须配置);

  • required:参数是否必传,默认为 true,可以设置为非必传 false;(如果设置了必传或默认,请求未传递参数,将会抛出异常);

  • defaultValue:参数默认值,如果设置了该值,required 将会自动设置为 false;

1.2 @RequestParam注解获取的参数放在请求体的哪个部分?

  • get请求的 requestHeaderscontent-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 这个字段,postcontent-type 有 :

  • application/x-www-form-urlencoded 这种就是一般的文本表单用 post 传地数据,只要将得到的 data@RequestParamrequest.getParamter() 获取即可;

  • multipart/form-data ,用于文件上传,此时 formenctype 属性必须指定为 multipart/form-data

  • application/json,将数据以json对象的格式传递;

  • text/xml

  • putdelete 请求的headers 是有 content-type 这个字段的,只不过这两个方法类型目前不常用;

@RequestParam和@RequestBody的使用相关推荐

  1. postbody传参_post传参params与body的区别(@RequestParam和@RequestBody的区别)

    1.axios post请求  Content-Type默认为 application/x-www-form-urlencoded,我们传递参数的时,params里面的参数(简单的对象,通过 &quo ...

  2. @RequestParam和@RequestBody的区别 (结合 Get/Post )

    一.get方法 请求:例如http://127.0.01:1025/download?url=https://www.baidu.com&token=opera-dev 获取请求参数: 直接获 ...

  3. HttpServletRequest和@Requestparam、@RequestBody、直接实体接收请求参数的区别与示例

    文章目录 概述 1.HttpServletRequest 2.@RequestParam 3.@RequestBody 4.直接实体接收 HttpServletRequest请求方法详解: 概述 客户 ...

  4. 获取后端接口请求中的参数(@PathVariable,@RequestParam,@RequestBody区别,使用postman请求

    获取参数 SpringBoot提供的获取参数注解包括:@PathVariable,@RequestParam,@RequestBody,三者的区别如下表: 一:后端接口什么都不加 postman请求后 ...

  5. 重点:@RequestMapping(含参数详解)和@RequestParam、@RequestBody、@PathVariable、@RequestHeader

    @RequestMapping注解 @RequestMapping是一个用来处理请求地址到处理器controller功能方法映射规则的注解,这个注解会将 HTTP 请求映射到 MVC 和 REST 控 ...

  6. @RequestParam和@RequestBody

    1.@RequestParam作用场景: 当前端传到后台时,后台接收的参数名和前台传递的参数名一致: 比如:正常情况下, jsp:<a href="param/testRequestP ...

  7. SpringMvc @RequestParam、 @RequestBody、@RequestPart 的区别

    注解@RequestParam接收的参数是来自requestHeader中,即请求头. RequestParam可以接受简单类型的属性,也可以接受对象类型. @RequestParam有三个配置参数: ...

  8. @PathVariable、@RequestParam、@RequestBody注解

    讲解更加详细的参考资料 https://blog.csdn.net/u011410529/article/details/66974974 https://www.cnblogs.com/soul-w ...

  9. 浅谈@RequestParam与@RequestBody区别

    @RequestParam:与servlet的request.getParameter()用法一致,都是用来接收form表单的提交,默认是application/x-www-form-urlencod ...

最新文章

  1. 【HDU】4509 湫湫系列故事——减肥记II (区间覆盖 暴力)
  2. WIFI搜索的到别人,却找不到自己家的wifi
  3. Flask框架从入门到精通之路由(三)
  4. STL源码剖析 heap堆结构
  5. Android 应用开发---ViewPager----1.相关基本知识
  6. 计算机视觉目标检测算法总结4——其他SSD系列算法
  7. 3D中obj文件操作
  8. 怎么更改wifi频段_科普 | 你了解WiFi信号扩展器吗?
  9. DataBufferLimitException: Exceeded limit on max bytes to buffer :262144
  10. 原型设计工具Pencil的使用
  11. 高斯过程回归(Gaussian process regression)原理详解及python代码实战
  12. 360路由器v2刷第三方固件_不走弯路:小米路由器3G 刷Padavan固件简单教程
  13. KeyStore(示例,出错代码)
  14. 益聚星荣:如何有理有据地给元宇宙泼一盆冷水?
  15. 正则表达式在线生成工具
  16. 最新高频Java面试题目分享,分布式ID(数据库多主模式
  17. python打开图片出错 IOError: cannot identify image file 解决方法
  18. 云堡垒机的作用_阿里云堡垒机详解
  19. uni-app实现多图片上传
  20. STC 下载 自动波特率 设计

热门文章

  1. 2021-2027全球及中国激光投影键盘行业研究及十四五规划分析报告
  2. 大功率可调谐半导体激光器总结(二)
  3. 这样的薪金制度合理吗?
  4. 并行计算、分布式计算、网格计算、云计算区别和联系
  5. 一起撸个朋友圈吧(step5) - 控件篇【控件组装评论控件】
  6. 计算机科学速成课笔记(五):计算机网络和计算机安全
  7. 大数据时代背景下的文物数据资源
  8. 此蓝牙设备或计算机无法处理该类型文件,蓝牙允许设备进行连接用不了_win10蓝牙允许设备连接灰色怎么解决...
  9. huggingface HF_HOME 更换缓存目录
  10. u10linux,腾达U10无线网卡驱动