注解RequestBody、RequestParam 与 GET 、POST请求的使用

参考
前后端分离的项目中,后台采用springboot,使用Restful风格设计接口,在GET请求下,如果后台使用@RequestBody注解接受参数,则会报错,而在POST请求下,如果后台使用@RequestParam注解接受参数也会报错。

一、GET与POST请求之间的差别
  • Get和Post都是Http协议的组件,所以底层都是使用tcp链接。Get的请求方式是将http的header和data一并发往服务端,也就是一条tcp数据包发送,这就会有两个问题:
  • 数据量有限,依赖于Tcp负载能力,所以携带的数据量很大的情况下,容易造成重发。所有的携带的数据只能接受转化成ASCII字符。
  • 但是Post不一样,post使用两步走,先发送http的header,然后再传输data。数据类型也不受限制。而且数据隐秘性比较好。
二、GET参数获取方式

get请求方式参数是拼接在url后,所以限制了可以发送的长度。Get不支持使用http Body获取参数,他只支持params,也就是URL拼接参数。如https://editor.csdn.net/md?articleId=107617370
get请求接受参数的标准就是使用url方式传参,如果请求参数过于复杂,理论上不推荐使用get方式传参,毕竟get传参还具有长度的限制

  • 默认方式
  • 使用@RequestParam注解
  • 使用HttpServletRequest
@RequestMapping(value = "/getUserInfo")
public User getUserInfo(HttpServletRequest request){
    Integer id = Integer.parseInt(request.getParameter("id"));
    if (id.intValue() == 0) {
        return null;
    }
}

这个方法是获取整个URL的信息,然后手动获取和分离参数,和类型转化。这个里面带的内容很多,不仅Param还有Header,Cookies等。

三、POST方式传递参数
  • post可以传递参数可以大致分成两种,一种是表单:在sevlet实现中mutipart/form-data和application/x-www-form-urlencoded会被特殊处理,请求参数将被放置于request.paramter,解析成map。第二种,已application/json,参数是存放在json中的,参数必须要用@RequestBody才能解析出来。
  1. @RequestBody
  • @RequestBody是将post请求中内容转为一个整体对象。
  • @RequestBody的解析有两个条件:
    1. POST请求中content的值必须为json格式(存储形式可以是字符串,也可以是byte数组);
    2. @RequestBody注解的参数类型必须是完全可以接收参数值的类型,比如:Map,JSONObject,或者对应的JavaBean;
    所以Integer类型不能作为@RequestBody注解的参数类型
    application/x-www-form-urlencoded : 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
  1. @RequestParam
  • 这种方式只用在Content-Type=application/x-www-form-urlencoded这种情况下才能使用,sevlet将Body中的key-value转成Param。
  • 有一个有趣的现象,如果Content-Type=mutipart/form-data,Body中加入参数和URL后面拼接参数一起做Post请求,都可以被加载到Param中,如果是同名的,只取用form-data中的。
  • 如果Content-Type=application/x-www-form-urlencoded和URL拼接的一起,如果是String类型,则两个值会被拼接,其他类型取的是URL拼接的参数。
  • application/x-www-form-urlencoded : 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
  1. 通用HttpServletRequest
  • 和Get方式一样,这是个通用的方式。这个也可以和URL拼接的一起搭,但是没有RequestParam的String类型值被拼接问题,优先级 form-data高于URL拼接高于x-www-form-urlencoded。
<think>好的,用户想了解Spring框架中的@RequestBody、@RequestParam和@PathVariable这三个注解的区别和用法。我需要先回忆这三个注解的基本作用,然后根据提供的引用资料来组织答案。 首先,@RequestParam是从请求的查询参数中获取值,也就是URL中?后面的键值对。比如/blogs?blogId=1中的blogId。用户提到的引用2和3都提到了这一点,说明它是处理查询参数的。不过要确认是否只能用于GET请求,或者也可以用于POST的查询参数。 然后是@PathVariable,它用于从URI模板中获取变量。例如/blogs/1中的1对应路径变量。引用2和3都指出这是用来获取动态路径参数的。需要说明它和@RequestParam在URL结构上的区别,一个在路径里,一个在查询字符串里。 接下来是@RequestBody,这个注解处理请求体中的数据,通常用于POST或PUT请求,将请求体中的JSON或XML绑定到对象上。引用3提到它接收的是请求体中的数据,而@RequestParam和@PathVariable处理的是URL部分的数据。引用4也提到@RequestBody用于处理请求体,适合复杂数据。 现在需要比较这三个注解的区别,包括数据来源、HTTP方法、数据类型和使用场景。用户提供的引用资料已经涵盖了这些点,需要整理成清晰的对比表格或分点说明。例如,@RequestParam用于查询参数,支持可选和默认值;@PathVariable用于URI路径中的变量,必需;@RequestBody处理请求体,适合复杂对象。 还要注意是否需要提到参数的必选性。比如@RequestParam可以通过required属性设置是否必需,而@PathVariable默认是必需的。引用2和3中可能提到这一点。 另外,用户提供的引用4提到这些注解在RESTful API中的重要性,所以在回答中可以强调它们在构建API时的不同应用场景,比如创建资源用@RequestBody,获取资源用@PathVariable或@RequestParam。 最后,根据用户要求生成相关问题。可能需要包括每个注解的具体使用示例,或者如何选择合适的注解,以及常见错误和解决方法。 需要确保回答结构清晰,分点说明每个注解的作用、用法示例、区别,并附上对比表格。同时,引用资料中的内容需要正确标注引用标识,如[^2][^3][^4]。</think>### Spring注解对比:@RequestBody vs @RequestParam vs @PathVariable #### 1. 核心区别 这三个注解主要用于**数据绑定**,但处理的数据来源和适用场景不同: | 注解 | 数据来源 | 典型HTTP方法 | 数据类型 | 是否必需 | |---------------|----------------|-------------|-----------------------|-------------------| | `@RequestParam` | URL查询参数 | GET | 简单类型(String/int)| 可配置`required` | | `@PathVariable` | URL路径片段 | GET | 简单类型 | 默认必需 | | `@RequestBody` | 请求体(Body) | POST/PUT | 复杂对象(JSON/XML) | 根据业务逻辑决定 | #### 2. 具体用法及示例 **① `@RequestParam`** - **作用**:从URL的查询参数中提取值,如`/blogs?page=2&size=10` - **示例**: ```java @GetMapping("/blogs") public List<Blog> getBlogs(@RequestParam int page, @RequestParam(defaultValue = "10") int size) { // 分页查询逻辑 } ``` - 可通过`defaultValue`设置默认值[^4] **② `@PathVariable`** - **作用**:绑定URL路径中的变量,如`/blogs/{id}` - **示例**: ```java @GetMapping("/blogs/{id}") public Blog getBlog(@PathVariable Long id) { // 根据ID查询博客 } ``` - URL路径需包含变量占位符`{id}` **③ `@RequestBody`** - **作用**:将请求体中的JSON/XML数据反序列化为Java对象 - **示例**: ```java @PostMapping("/blogs") public Blog createBlog(@RequestBody BlogDTO blogDTO) { // 创建新博客 } ``` - 通常`POST`或`PUT`请求配合使用 #### 3. 如何选择? - **标识资源**:用`@PathVariable`(如`/users/123`) - **过滤/分页**:用`@RequestParam`(如`/users?role=admin`) - **提交复杂数据**:用`@RequestBody`(如创建订单) #### 4. 常见问题 - **混合使用**:允许同时使用多个注解 ```java @PutMapping("/blogs/{id}") public void updateBlog(@PathVariable Long id, @RequestBody BlogUpdateDTO dto) { // 路径变量+请求体组合 } ``` - **类型转换**:Spring自动处理简单类型的转换(如String→int)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值