@RequestBody和@RequestParam区别全面详细_map @requestparam 和 @requestbody 区别-程序员宅基地

技术标签: spring boot  毕设  

@RequestParam

注解@RequestParam接收的参数是来自requestHeader中,即请求头。

RequestParam可以接受简单类型的属性,也可以接受对象类型。

@RequestParam有三个配置参数:

required 表示是否必须,默认为 true,必须。
defaultValue 可设置请求参数的默认值。
value 为接收url的参数名(相当于key值)。

@RequestParam用来处理 Content-Type 为 application/x-www-form-urlencoded 编码的内容,Content-Type默认为该属性。@RequestParam也可用于其它类型的请求,例如:POST、DELETE等请求。

所以在postman中,要选择body的类型为 x-www-form-urlencoded,这样在headers中就自动变为了 Content-Type : application/x-www-form-urlencoded 编码格式。
但是这样不支持批量插入数据啊,如果改用 json 字符串来传值的话,类型设置为 application/json,点击发送的话,会报错,后台接收不到值,为 null。

这时候,注解@RequestBody就派上用场了。继续往下看

@RequestBody

注解@RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:application/json、application/xml等类型的数据。

就application/json类型的数据而言,使用注解@RequestBody可以将body里面所有的json数据传到后端,后端再进行解析。

GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。

POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用

HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。

向表中批量插入数据

举个批量插入数据的例子,Controller层的写法如下图所示:

由于@RequestBody可用来处理 Content-Type 为 application/json 编码的内容,所以在postman中,选择body的类型为row -> JSON(application/json),这样在 Headers 中也会自动变为 Content-Type : application/json 编码格式。body内的数据如下图所示:

批量向表中插入两条数据,这里的 saveBatchNovel()方法已经封装了 JPA的 saveAll() 方法。body 里面的 json 语句的 key 值要与后端实体类的属性一一对应。

注意:前端使用$.ajax的话,一定要指定 contentType: “application/json;charset=utf-8;”,默认为 application/x-www-form-urlencoded。

后端解析json数据

上述示例是传递到实体类中的具体写法,那么如果传递到非实体类中,body里面的json数据需要怎么解析呢?我们再来看下面这个例子:

在body中,我们还是输入上面的json数据,根据分析,上面的json数据是一个List数组内嵌套着map对象,那么在后台的接收形式可写为 List<Map<String, String>>,具体代码如下图所示:

postman请求:

控制台输出:

得出结论,通过@RequestBody可以解析Body中json格式的数据。

?
?

POST请求时

@RequestBody --> JSON字符串部分

@RequestParam --> 请求参数部分

application/json格局图

form-data、x-www-form-urlencoded格局图

?

1、从content-type方面总结:

① form-data、x-www-form-urlencoded:不可以用@RequestBody;可以用@RequestParam。见postman的格局,这两种方式的时候没有json字符串部分。

② application/json:json字符串部分可以用@RequestBody;url中的?后面参数可以用@RequestParam。见postman的格局

?

2、从两种注解方式总结:
@RequestBody
(@RequestBody Map map)
(@RequestBody Object object)
application/json时候可用
form-data、x-www-form-urlencoded时候不可用

   
   
    
  • 1
  • 2
  • 3
  • 4
@RequestParam
(@RequestParam Map map)
application/json时候,json字符串部分不可用,url中的?后面添加参数即可用,form-data、x-www-form-urlencoded时候可用,但是要将Headers里的Content-Type删掉

   
   
    
  • 1
  • 2
(@RequestParam String waterEleId,@RequestParam String enterpriseName)
application/json时候,json字符串部分不可用,url中的?后面添加参数即可用
form-data、x-www-form-urlencoded时候可用,且参数可以没有顺序(即前端传过来的参数或者url中的参数顺序不必和后台接口中的参数顺序一致,只要字段名相同就可以),但是要将Headers里的Content-Type删掉

   
   
    
  • 1
  • 2
  • 3
(@RequestParam Object object)
不管application/json、form-data、x-www-form-urlencoded都不可用

   
   
    
  • 1
  • 2
既不是@RequestBody也不是@RequestParam,没有指定参数哪种接收方式
(Map map)
(Object object)
application/json时候:json字符串部分不可用,url中的?后面添加参数不可用。
因为没有指定,它也不知道到底是用json字符串部分还是?后面添加参数部分,所以干脆都不可以用
form-data、x-www-form-urlencoded时都不可用,见图二

(HttpServletRequest request)
application/json不可用
form-data、x-www-form-urlencoded时可用

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
GET请求
@RequestBody
RequestBody -- Map / Object
GET请求中不可以使用@RequestBody

 
 
  
  • 1
  • 2
@RequestParam
(@RequestParam Map map)
在url中的?后面添加参数即可使用

 
 
  
  • 1
  • 2
(@RequestParam String waterEleId,@RequestParam String enterpriseName)
在url中的?后面添加参数即可使用

 
 
  
  • 1
  • 2
(@RequestParam Object object)
GET请求中不可以使用

 
 
  
  • 1
  • 2

当使用GET请求时,通过postman添加?后面的参数,不用在url中自己一个一个拼,点击Params,在下面key-value中输入就自动拼接到url中

举列子
上传文件,包含了图中圈出来的两部分

如果这样,没有@RequestParam,那么url?后的参数就拿不到

@RequestMapping(value = "/leadingIn", method = RequestMethod.POST)
    public ResponseObj<Boolean> leadingIn(Map formData,
                                          HttpServletRequest request,
                                          Map<String, InputStream> files) {
    
}

 
 
  
  • 1
  • 2
  • 3
  • 4
  • 5

如果control中这样接收,本来想formData只接收url?后的参数,结果将{ “retCode”: null, “data”: true }这部分内容也拿到了,真实意外之喜。字符串这部分内容还可以从request中取到,见下面完整方法。

@RequestMapping(value = "/leadingIn", method = RequestMethod.POST)
    public ResponseObj<Boolean> leadingIn(@RequestParam Map formData,
                                          HttpServletRequest request,
                                          Map<String, InputStream> files) {
    
}

 
 
  
  • 1
  • 2
  • 3
  • 4
  • 5
完整方法
 /**
     * 导入
     */
    @RequestMapping(value = "/leadingIn", method = RequestMethod.POST)
    public ResponseObj<Boolean> leadingIn(@RequestParam Map formData,
                                          HttpServletRequest request,
                                          Map<String, InputStream> files) {
    
        //测试
        try {
    
            MultipartHttpServletRequest mulRequest = (MultipartHttpServletRequest) request;
            Set<Map.Entry<String, MultipartFile>> set = mulRequest.getFileMap().entrySet();
            Map<String, InputStream> listFile = new LinkedHashMap<>();
            System.out.println("个数" + set.size());
            for (Map.Entry<String, MultipartFile> each : set) {
    
                String fileName = each.getKey();
                MultipartFile file = each.getValue();
                //这里需要上传FTP
                try {
    
                    listFile.put(fileName, file.getInputStream());
                } catch (Exception ex) {
    
                    return new ResponseObj<>(false, null);
                }
            }
        String formjson <span class="token operator">=</span> mulRequest<span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">"content"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        ObjectMapper mapper <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectMapper</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        mapper<span class="token punctuation">.</span><span class="token function">setVisibility</span><span class="token punctuation">(</span>PropertyAccessor<span class="token punctuation">.</span>FIELD<span class="token punctuation">,</span> JsonAutoDetect<span class="token punctuation">.</span>Visibility<span class="token punctuation">.</span>ANY<span class="token punctuation">)</span><span class="token punctuation">;</span>
        mapper<span class="token punctuation">.</span><span class="token function">configure</span><span class="token punctuation">(</span>DeserializationFeature<span class="token punctuation">.</span>FAIL_ON_UNKNOWN_PROPERTIES<span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

// boolean result = iInstallWorkOrder.upLoadFile(listFile);
boolean result = true;

        <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">ResponseObj</span><span class="token operator">&lt;</span><span class="token operator">&gt;</span><span class="token punctuation">(</span>result<span class="token punctuation">,</span> null<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> ex<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>ex<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">ResponseObj</span><span class="token operator">&lt;</span><span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">,</span> null<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

<span class="token punctuation">}</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

按F12看一下Network里对应请求:

使用@RequestParam:Content-Type为application/x-www-form-urlencoded,参数在FormData中

使用@RequestBody:Content-Type为application/json,参数在Request PayLoad中

总结

1.  在GET请求中,不能使用@RequestBody
2. 在POST请求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,对于参数转化			 的配置必须统一。
3. 可以使用多个@RequestParam获取数据,@RequestBody不可以 

 
 
  
  • 1
  • 2
  • 3
3.1标题举个例子
	在SpringMVC配置了HttpMessageConverters处理栈中,指定json转化的格式,如Date转成‘yyyy-MM-dd’,则参数接收对象包含的字段如果是Date类型,就只能让客户端传递年月日的格式,不能传时分秒。因为不同的接口,它的参数可能对时间参数有不同的格式要求,所以这样做会让客户端调用同事对参数的格式有点困惑,所以说扩展性不高。 如果使用@RequestParam来接受参数,可以在接受参数的model中设置@DateFormat指定所需要接受时间参数的格式。 另外,使用@RequestBody接受的参数是不会被Servlet转化统一放在request对象的Param参数集中,@RequestParam是可以的。 
4. 另外,还有一种应用场景,接口规范为resultful风格时,举个例子:如果要获取某个id下此条问题答案的查询次数的话,则后台就需要动态获取参数,其注解为@PathVariable,并且requestMapping中的value应为value="/{id}/queryNum",

 
 
  
  • 1
  • 2

参考:

@RequestParam @RequestBody @PathVariable 等参数绑定注解详解

https://blog.csdn.net/walkerjong/article/details/7946109

https://my.oschina.net/u/3372000/blog/906217

https://www.jianshu.com/p/4981911d5e15

https://cloud.tencent.com/developer/article/1414464

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_46806288/article/details/127238899

智能推荐

SoundStream: 下一代的神经网络音频编解码器,实时压缩不牺牲音质

音频编解码技术的目标是,通过减少音频文件的大小来节省存储空间或减轻网络传输的负担。理想的情况下,即使音频被压缩,我们听到的声音与原版也应该没有任何区别。过去,已经有不少编解码技术被开发出来,满足了这些需求,比如Opus和EVS这两种编解码器就很出名。Opus是一个多才多艺的音频编解码器,它适用于各种应用,从视频会议(比如 Google Meet)到在线视频流(比如 YouTube)。Opus支持的压缩比率非常灵活,从每秒6千比特到每秒510千比特都可以。而EVS,是由针对移动>)开发的最新编解码器。

CentOS7下MySQL(Percona-Server-5.7)安装及简单使用_percona-server-5.7.24-27-rbd42700-el7-x86_64-bundl-程序员宅基地

文章浏览阅读1.9k次,点赞4次,收藏4次。本文介绍MySQL衍生版本Percona-Server-5.7的安装及使用。CentOS7下建议使用较高版本的Percona-Server!!!目录1、下载及安装2、简单使用1、启动mysql2、查看临时密码3、登录mysql4、修改root密码3、客户端连接mysql1、下载及安装下载Percona-Server-server-57-5.7.32,下载地址如下:https://www.percona.com/downloads/Percona-Server-_percona-server-5.7.24-27-rbd42700-el7-x86_64-bundle.tar

探索Freejam的世界:组建,驾驶,然后与Robocraft对抗-程序员宅基地

文章浏览阅读1.1k次。随着新发布的Xsolla与Freejam热门游戏Robocraft的合作关系达成,我们觉得是时候带大家回顾一下我们的合作过程和Robocraft的故事。我们和Freejam富有激情的成员聊了聊,做了一些采访,并了解到他们是如果将热门游戏从一个概念变成独立工作室的。可以为我们简单介绍一下Freejam的游戏和Robocraft么?Freejam成立20_freejam

html的li浮动之后往下移动,多个li浮动后居中显示问题-程序员宅基地

文章浏览阅读671次。在实际工作当中经常会遇到像上面这样的布局,就是不确定li的个数,但是想让它在父元素内水平居中显示或是相对父元素两端对齐。先看基础的/p>这样只能靠左显示。解决方法目前搜集了三种:第一种:利用css3选择器:nth-child(n)设定最后一列li的margin-right值为0。这也是我第一反应想到的方法,添加/p>第二种:设置ul的margin-left为负值。这是从猫爷的博客看到的..._li里面字体向下移动

07.显示系统:第003课_最简单的Surface测试程序:第01节_最简单的Surface测试程序_surfaceflinger测式程序-程序员宅基地

文章浏览阅读755次,点赞7次,收藏5次。在前面的章节中,简单的分析了android显示系统的框架,我们知道一个应用程序之中,存在一个或者多个buffer用来存放界面的数据,单应用程序构造好这些buffer之后,他会把这些buffer发送给surfaceFlinger,由surfaceFlinger决定在合适的时候把buffer中的数据拷贝到framebuffer,这样才能在屏幕上显示界面。应用程序的buffer需要向surfaceFli......_surfaceflinger测式程序

基于Spring Boot的外卖点餐系统设计与实现

随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势社会的发展和科学技术的进步,互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。互联网具有便利性,速度快,效率高,成本低等优点。因此,构建符合自己要求的操作系统是非常有意义的。本文从用户的功能要求出发,建立了外卖点餐系统 ,系统中的功能模块主要是实现管理员;

随便推点

re.split()分割字符串详解

re.split()方法是根据正则表达式匹配将字符串进行分割,并以列表形式返回.跟字符串的split()方法用法类似.pattern: 模式字符串,分割字符 string:要匹配的字符串 maxsplit:可选参数,别是最大的拆分次数 flags:可选参数,比如re.I 不区分大小写.re.S使(.)能够匹配所有字符,包括换行符代码。

电子式汽车机油压力传感器的接线方法及特点

MEMS硅压阻压力传感器采用外围固定的圆形应力杯的硅膜内壁,利用MEMS技术在表面应力最大的地方直接雕刻四个高精度半导体应变片,形成惠斯通测量电桥,作为电电转换测量电路,将压力物理量直接转换为电能,测量精度可达0.01-0.03%FS。特定的故障代码,如“P01CA”(机油压力传感器电压高于上限),可以直接指向机油压力传感器的问题。正常情况下,传感器的输入端之间、输出端之间应有一定的电阻值,具体数值参照传感器的规格手册。然而,机油压力传感器,也称为机油压力开关或传感器,根据车辆的不同,其位置也不同。

【LEACH协议】基于matlab实现分簇协议leach和deec仿真生命周期和数据传输对比-程序员宅基地

文章浏览阅读823次,点赞24次,收藏16次。分簇协议LEACH和DEEC是两种常用的能源有效的传感器网络协议。它们都旨在延长传感器网络的生命周期并提高数据传输效率。在本文中,我们将对这两种协议进行仿真,并比较它们的生命周期和数据传输性能。LEACH(低能耗自适应簇头)是一种经典的分簇协议,它通过随机选择簇头来平衡能量消耗,并且在每个轮次中轮流选择新的簇头,以确保能量消耗均衡。DEEC(分布式能源有效的簇头)是LEACH的改进版本,它通过考虑节点的能量级别来选择簇头,并且引入了轮流选择簇头的机制,以进一步减少能量消耗。

计算机网络的认识_谈一谈你对计算机网络的认识-程序员宅基地

文章浏览阅读5.8k次,点赞10次,收藏32次。计算机网络的认识一、计算机网络的概念定义:计算机网络就是互连的,自治的计算机的集合。互联网:网络的网络。Internet是最大互联网二、发展阶段第一阶段:从单个网络到ARPANET向互联网发展的过程第二阶段:三级结构的互联网第三阶段:逐渐形成多层次ISP结构的互联网三、组成计算机网络包括硬件、软件、协议三大部分硬件:主机(计算机),通信处理器,通信线路,交换设备;软件:各种..._谈一谈你对计算机网络的认识

MinGW-CMake-OpenCV-Clion 配置_-- the c compiler identification is gnu 8.1.0 -- t-程序员宅基地

文章浏览阅读2.9k次。参考CLion 中 的 MinGW 配置(及中文坑解决) - 知乎Windows-MinGW-CMake-OpenCV 配置 - 知乎前言笔者前面发布了vs2019下opencv的配置教程,但是vs的项目有点臃肿,相对而言笔者更喜欢用clion进行开发.于是有了这片探索博文.安装CMake与MinGW64第一部分都是照搬的知乎一位作者的答案,因为写的很好没有必要改.首先安装CMake,下图演示了大概安装流程:1- 去 CMake 官网(https://cmake.org._-- the c compiler identification is gnu 8.1.0 -- the cxx compiler identifica

Python闭包:深入解析与使用场景

在Python中,一个函数内部定义的另一个函数(称为内部函数或嵌套函数),如果引用了外部函数的变量,那么这个内部函数就形成了一个闭包。在Python编程世界中,闭包(Closure)是一个强大而灵活的概念,它允许函数携带其定义时的环境信息,并在后续调用时访问这些信息。:在异步编程、事件驱动编程等场景中,回调函数是常见的模式。外部函数最后返回内部函数,这样当外部函数执行完毕后,内部函数(即闭包)仍然可以访问外部函数的变量。闭包的关键在于,它不仅仅是一个函数对象,它还包含了函数被定义时的环境信息,即词法环境。