@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)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • eclipse Maven配置[通俗易懂]

    eclipse Maven配置[通俗易懂]简述:现需要在Eclipse中配置Maven插件,同时安装maven应用,配置Maven环境变量,建立Maven管理的工程,并用Maven导入Gson包,编写简易Json输出程序步骤:1.首先到EclipseMarketplace中下载MavenIntegrationforEclipseWTP,如下,之后查看是否成功下载,Win

  • Landsat 9 数据详细介绍

    Landsat 9 数据详细介绍1.基本情况Landsat9号是Landsat系列中最新的一颗卫星,计划于2020年12月在加利福利亚范登堡空军基地加利福尼亚由AtlasV401火箭搭载进行发射,实际于于2021年9月27日发射,并已经开始采集第一批数据,2021年10月31日获取到遥感数据。Landsat9是继续Landsat系列对地球表面观测不可替代的记录。为了减少建造时间和观测缺口的风险,Landsat9在很大程度上复制了它的前身Landsat8。来源:原文链接…

  • 什么情况下需要重写hashcode方法_gethashcode

    什么情况下需要重写hashcode方法_gethashcodeHashCode作用,如何重载hashCode方法前言Object类提供了一个Native方法publicnativeinthashCode();下面简单介绍下Hash以及HashCode方法的作用HashHash是散列的意思,就是把任意长度的输入,通过散列算法换成固定长度的输出,概述出就是散列值,关于散列值,有一下几个关键结论:如果散列表存在和散列原始输入K相等的记录,那么K必定在f…

  • 代码解读器_网页代码解读

    代码解读器_网页代码解读0写在前面在对STN的原论文进行了翻译、理解后,我打算去github上运行下源码,以加深对ST的理解。毕竟,talkischeap,showmethecode!此外,虽然论文作者发布是tf的源码,但由于我对tensorflow不如pytorch熟稔,因此这里我只看了pytorch官网复现的STN代码。发现写得非常详细,很适合小白入门,因此我放弃了自己解读的机会,打算就搬运一下原教程哈哈。1具体教程注:以下内容均为复制/翻译,不过我在代码上加了点中文注释Spatialtransfor

  • Golang小技巧

    Golang小技巧

  • php中PHPMailer发送带附件的电子邮件方法

    php中PHPMailer发送带附件的电子邮件方法

发表回复

您的电子邮箱地址不会被公开。

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