注解RequestBody和RequestParam的请求方式get和post

由于项目是前后端分离,因此后台使用的是spring boot,做成微服务,只暴露接口。接口设计风格为restful的风格,在get请求下,后台接收参数的注解为RequestBody时会报错;在post请求下,后台接收参数的注解为RequestParam时也会报错。

二、问题原因

     由于spring的RequestParam注解接收的参数是来自于requestHeader中,即请求头,也就是在url中,格式为xxx?username=123&password=456,而RequestBody注解接收的参数则是来自于requestBody中,即请求体中。

三、解决方法

      因此综上所述,如果为get请求时,后台接收参数的注解应该为RequestParam,如果为post请求时,则后台接收参数的注解就是为RequestBody。附上两个例子,截图如下:

      get请求

  

post请求

 

        另外,还有一种应用场景,接口规范为resultful风格时,举个例子:如果要获取某个id下此条问题答案的查询次数的话,则后台就需要动态获取参数,其注解为@PathVariable,并且requestMapping中的value应为value="/{id}/queryNum",截图如下:

### @RequestBody @RequestParam 注解的区别 在 Spring MVC 中,`@RequestBody` `@RequestParam` 是两种不同的注解,用于处理 HTTP 请求的不同部分。 #### 处理的数据位置不同 - **@RequestParam** 主要用于获取 URL 查询参数或表单提交的简单类型参数。这类参数通常位于 URL 后面作为查询字符串的一部分或者是 HTML 表单字段[^1]。 - **@RequestBody** 则是用来读取整个 HTTP 请求体的内容,并将其映射到方法参数上。这特别适合于接收 JSON 或 XML 形式的复杂对象数据[^3]。 #### 数据格式支持差异 - 对于 **@RequestParam** 而言,它能够很好地处理标准浏览器发送过来的传统形式编码(`application/x-www-form-urlencoded`)以及多部分/表单数据(`multipart/form-data`)类型的请求[^4]。 - 反之,当涉及到更复杂的媒体类型如 JSON (`application/json`) 或者 XML (`application/xml`) 时,则应采用 **@RequestBody** 进行解析并转换成相应的 Java 类型实例。 #### 使用场景举例说明 下面给出一段简单的代码片段来展示两者如何被应用: ```java @RestController public class ExampleController { // 使用 @RequestParam 获取 GET 请求中的 query string 参数 @GetMapping("/example") public String getExample(@RequestParam(value="name", required=false, defaultValue="World") String name){ return "Hello "+name; } // 使用 @RequestBody 接收 POST 请求携带的应用级负载 (JSON) @PostMapping(path="/example", consumes="application/json") public void postExample(@Valid @RequestBody MyObject myObj){ System.out.println(myObj); } } ``` 这段代码展示了如何利用这两个注解分别针对不同类型的操作执行相应逻辑:前者是从路径 `/example?name=John` 提取出名字;后者则是接受来自客户端的一个 JSON 文档并反序列化为一个名为 `MyObject` 的实体类实例[^2]。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值