前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >@RequestBody 和 @RequestParam可以同时使用

@RequestBody 和 @RequestParam可以同时使用

作者头像
全栈程序员站长
发布2022-07-04 09:10:50
2.8K0
发布2022-07-04 09:10:50
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

@RequestParam和@RequestBody这两个注解是可以同时使用的。

网上有很多博客说@RequestParam 和@RequestBody不能同时使用,这是错误的。根据HTTP协议,并没有说post请求不能带URL参数,经验证往一个带有参数的URL发送post请求也是可以成功的。只不过,我们日常开发使用GET请求搭配@RequestParam,使用POST请求搭配@RequestBody就满足了需求,基本不怎么同时使用二者而已。

自己个人实际验证结果:

代码语言:javascript
复制
package com.example.model;

import java.util.List;

public class PramInfo {
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    private int id;
    private String str;

}

package com.example.demo;

import com.example.model.PramInfo;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping(value = "/test")
public class TestContoller {

    @RequestMapping(value = "/dxc")
    public String print(PramInfo info) {
        return info.getId() + ": :" + info.getStr();
    }

    @RequestMapping(value = "/getUserJson")
    public String getUserJson(@RequestParam(value = "id") int id, @RequestParam(value = "name2", required = false) String name2
            , @RequestBody PramInfo pramInfo) {
        return (id + "--" + name2 + ";paramInfo:" + pramInfo.getStr() + ";pramInfo.id:" + pramInfo.getId());
    }
}

在postman发送如下post请求,返回正常:

@RequestBody 和 @RequestParam可以同时使用
@RequestBody 和 @RequestParam可以同时使用

body中参数如下:

@RequestBody 和 @RequestParam可以同时使用
@RequestBody 和 @RequestParam可以同时使用

从结果来看,post请求URL带参数是没有问题的,所以@RequestParam和@RequestBody是可以同时使用的【经测试,分别使用Postman 和 httpClient框架编程发送http请求,后端@RequestParam和@RequestBody都可以正常接收请求参数,所以个人认为可能一些前端框架不支持或者没必要这么做,但是不能说@RequestParam和@RequestBody 不能同时使用】。

值得注意的地方:

1、postman的GET请求是不支持请求body的;

2、

代码语言:javascript
复制
 @GetMapping(value = "/dxc")
    public String print(PramInfo info) {
        return info.getId() + ": :" + info.getStr();
    }

这种请求方式,不加@RequestParam注解,也能直接取出URL后面的参数,即参数可以与定义的类互相自动转化。

3、

代码语言:javascript
复制
@PostMapping(value = "/getUserJson")
    public String getUserJson(@RequestParam(value = "id") int id, @RequestParam(value = "name2", required = false) String name2
            , @RequestBody PramInfo pramInfo) {
        return (id + "--" + name2 + ";paramInfo:" + pramInfo.getStr() + ";pramInfo.id:" + pramInfo.getId());

如果请求中的body没有ParamInfo对象对应的json串,即当body为空(连json串的{}都没有)时,会报请求body空异常:

@RequestBody 和 @RequestParam可以同时使用
@RequestBody 和 @RequestParam可以同时使用
代码语言:javascript
复制
2018-05-12 23:45:27.494  WARN 6768 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public java.lang.String com.example.demo.TestContoller.getUserJson(int,java.lang.String,com.example.model.PramInfo)-05-12 23:45:27.494  WARN 6768 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public java.lang.String com.example.demo.TestContoller.getUserJson(int,java.lang.String,com.example.model.PramInfo)

参考文章: https://unmi.cc/why-http-get-cannot-sent-data-with-reuqest-body/

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/148706.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档