@RequestBody 和 @RequestParam可以同时使用

@RequestBody 和 @RequestParam可以同时使用@RequestParam和@RequestBody这两个注解是可以同时使用的。网上有很多博客说@Requestparam和@RequestBody不能同时使用,这是错误的。根据HTTP协议,并没有说post请求不能带URL参数,经验证往一个带有参数的URL发送post请求也是可以成功的。自己个人实际验证结果:packagecom.example.model;import…

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

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

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

         自己个人实际验证结果:

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可以同时使用
body中参数如下:
 
@RequestBody 和 @RequestParam可以同时使用
        从结果来看,post请求URL带参数是没有问题的,所以@RequestParam和@RequestBody是可以同时使用的【经测试,分别使用Postman 和 httpClient框架编程发送http请求,后端@RequestParam和@RequestBody都可以正常接收请求参数,所以个人认为可能一些前端框架不支持或者没必要这么做,但是不能说@RequestParam和@RequestBody 不能同时使用】。
值得注意的地方:
1、postman的GET请求是不支持请求body的;
2、
 

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

这种请求方式,不加@RequestParam注解,也能直接取出URL后面的参数,即参数可以与定义的类互相自动转化。
 
 
3、
@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可以同时使用
 
 

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://javaforall.net/148706.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月16日 上午10:00
下一篇 2022年6月16日 上午10:00


相关推荐

  • 要在校园里养“龙虾”?这些安全风险须注意!

    要在校园里养“龙虾”?这些安全风险须注意!

    2026年3月14日
    2
  • mpVue_mpvue是什么

    mpVue_mpvue是什么mpvue配置flyio安装flyio配置fly安装flyiofly中文文档https://wendux.github.io/dist/#/doc/flyio/interceptor使用npm安装fly:npminstallflyio在src/main.js文件下引入其它引入方式请查看https://github.com/wendux/fly配置fly在使用fly请求借口是,…

    2025年10月9日
    3
  • fabricjs相关方法知识点

    fabricjs相关方法知识点fabricjs 相关方法知识点 1 获得画布上的所有对象 varitems canvas getObjects 2 设置画布上的某个对象为活动对象 canvas setActiveObj items i 3 获得画布上的活动对象 canvas getActiveObj 4 取消画布中的所有对象的选中状态 canvas discardActiv 如果这样不生效 可以使用 canvas discardActiv

    2026年3月19日
    2
  • 开挂网站免费版_开心ol辅助脚本

    开挂网站免费版_开心ol辅助脚本开讲。做一个Web游戏外挂需要的准备知识:1)需要有耐心2)熟悉HTML,JavaScript,特别是FORM3)熟悉HTTP协议,特别是Cookie,URL的编码方式和POST,GET内容格式4)熟悉游戏本身,能抽象出最优的赚钱/升级的数学模型5)掌握一门语言,白菜萝卜都可以,我比较喜欢用Python和C#6)需要一些抓包的工具,比如Fiddle…

    2025年11月8日
    5
  • 即梦AI怎么更换手机号

    即梦AI怎么更换手机号

    2026年3月12日
    3
  • JavaScript面向对象思想

    JavaScript面向对象思想javascript中的面向对象:ECMA标准定义JS中的对象:无序属性的集合,其属性可以包含基本值、对象或者函数。可以简单理解为JS的对象是一组无序的值,其中的属性或方法都有一个名字,根据这个名字可以访问相映射的值(值可以是基本值/对象/方法)面向对象三个基本特征是:封装、继承、多态封装:将对象运行所需的资源封装在程序对象中,基本上是方法和数据。对象是“公布其接口”。其他附加到这些接口上的对象不需要关心对象实现的方法即可使用这个对象。这个概念就是“不要告诉我你是怎么做的,只要做就可以了。”对象可

    2025年6月17日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号