重磅来袭:Spring之RequestBody的使用姿势小结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重磅来袭:Spring之RequestBody的使用姿势小结相关的知识,希望对你有一定的参考价值。

参考技术A

SpringMVC中处理请求参数有好几种不同的方式,如我们常见的下面几种

对上面几种方式有兴趣的可以看一下这篇博文: SpringMVC之请求参数的获取方式

除了上面的几种方式之外,还有一种 @RequestBody 的使用方式,本文则主要介绍这种传参的使用姿势和相关注意事项

借助Spring框架,使用@RequestBody并没有什么难度,很简单的就可以写一个使用case出来,如下

看上面的实现,和我们通常的写法并无差别,无非是将以前的 @RequsetParam 注解换成 @RequsetBody 注解,而且这个注解内部只有一个filed,比RequsetParam还少

看到上面的实现,估计也可以猜出,这个注解对于后端而言,写没啥问题,关键是如何用(具体来讲是如何给前端用)

上面写完了,接下来的重点就是如何使用了,在使用之前,有必要了解下 RequestBody 这个注解出现的原有以及应用场景(换句话说它和RequestParam有什么区别,为什么要单独地搞一个这个东西出来)

RequestBody

a. content-type定义

在进入下一步之前,有必要说一下Content-Type这个http请求头的作用了,下面一段来自其他博文,原文链接见最后

常见媒体格式如下:

以application开头的媒体格式类型:

b. content-type 实例说明

上面算是基本定义和取值,下面结合实例对典型的几种方式进行说明

对于前端使用而言,form表单的enctype属性为编码方式,常用有两种:
application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。

Get请求

发起Get请求时,浏览器用
application/x-www-form-urlencoded方式,将表单数据转换成一个字符串(key1=value1&key2=value2...)拼接到url上,这就是我们常见的url带请求参数的情况

Post表单

发起post请求时,如果没有传文件,浏览器也是将form表单的数据封装成k=v的结果丢到http body中,拿开源中国的博客提交的表单为例,一个典型的post表单,上传的数据拼装在form data中,为kv结构

如果有传文件的场景,Content-Type类型会升级为multipart/form-data,这一块不详细展开,后面有机会再说

Post json串

post表单除了前面一种方式之外,还有一种也是我们常见的,就是将所有的表单数据放在一个大的json串中,然后丢给后端,这里也有一个在线的实例,某电商平台的商品发表,截图如下

注意看上面的Request Payload,是一个大的json串,和前面差别明显

c. RequestBody请求

根据RequestBody的定义,要想访问前面定义的那个接口,使用传统的表单传递方式是不行的,curl命令测试如下

后端对应的输出如下(抛了一个异常,表示@RequestBody注解修饰rest接口,不支持 Content type \'
application/x-www-form-urlencoded;charset=UTF-8\'

因此使用姿势需要显示添加请求头,传参也改变一下

返回结果如下

a. content-type显示指定

根据前面的说明,可以知道 @RequestBody 这个注解的使用,使得REST接口接收的不再content-type为
application/x-www-form-urlencoded的请求, 反而需要显示指定为application/json

b. 请求方法

RequestBody支持GET方法么?前面都是采用post提交参数,如果改成GET会怎样?

curl测试方式

对应的后端debug截图如下,发现使用GET方式,并没有问题,依然可以获取到参数

换成大名鼎鼎的POSTMAN来测试

使用post方法请求时,截图如下,主要就是修改header的content-type,然后在body中添加json串格式的请求

然而改成get之后,body都直接灰掉了,也就是它不支持在get请求时,提交Body数据

url请求方式

接下来直接换成url的请求方式,看是否直接支持get请求

浏览器中输入时,服务器400, 换成curl方式请求,抛的是缺少RequestBody的异常,也就是说,将json串拼接到url中貌似不行(也有可能是我的使用姿势不对。。。)

小结

c. 参数获取

这个主要就是后端编写接口时,获取RequestBody参数的问题了,通过测试,发现在HttpServletRequest参数中,居然拿不到提交的RequestBody参数,演示如下

请求url为

对应的debug截图如下,url参数可以拿到,RequestBody参数没有

首先声明,下面的这段分析,没有看源码,纯属于个人推断,如有问题,对被误导的朋友表示歉意,也希望对此有了解的朋友,多多批评指正

对上面的猜测做一个小小的验证,改成直接从HttpServletRequest的Reader流中获取请求body参数

验证如下

其实到这里,有个有意思的地方已经引起了我的好奇,那就是在Spring容器中HttpServletRequest这个东西,是怎么运转的,后面有机会再聊,此处不展开...

</article>
最后,我还整理了一份面试宝典,有需要的私信小助理【666】

“StarRocks 极客营” 重磅来袭,和技术大牛一起推开数据库梦想之门!

操作系统、编译器、数据库是软件工程师的梦之所向,对于大多数人而言,却是近在眼前、远在天边:

  • 你是否曾渴望加入 Linux 这样伟大的社区,然觉门槛太高无从下手?

  • 你是否也曾想象参与开发 MySQL 这样顶级的项目,可融入无门?

  • 你是否梦想让自己的代码为更多人所用,苦于孤军奋战、条件不足?

在 StarRocks 社区,

实现梦想并没有想象中那么难!

StarRocks 极客营,

专为数据库领域的开发爱好者而打造,

在 16 天内挑战不同难度的开发实战,

真枪实干,不玩虚的!

隐藏在社区中的极客们,

春天到了,露一手!

活动亮点

总有一款适合你

StarRocks 社区选取 Execution Engine、Storage Engine、Data Lake Analysis、Ecosystem、Loading、Observability、Planner、Usability  8 个方向,开放了 34 个开发任务,难度分为挑战级、中等、简单三档。无论你是新手开发者、进阶攻城狮、资深技术专家,此次活动的开发任务,总有一款适合你。通过本次极客营,你将对 OLAP 技术有更加深入的了解和洞察,助你成为技术专家!

社区大牛带你飞

纠结不够了解 StarRocks ?害怕技术细节把控不好?如何写出优雅的代码?别担心,社区安排了多位业界技术大牛,手把手指导你,而且不!要!培!训!费!

这些大牛不仅有 Apache 顶级项目的 PMC、Committer,有知乎上的技术大 V,还有分布式存储、向量化计算、云原生等各方向的资深技术专家,如此规格的技术阵容,国内屈指可数!

真刀真枪 不玩演习

所有任务全部来自于真实业务场景,在极客营结束后,社区评审团会根据开发任务完成质量情况,择优合并到 StarRocks repo 的 main 分支,你的代码将会服务于全球更多用户和更多业务场景,你也将成为 StarRocks 社区不可或缺的一名 Contributor!

自主开发通道,留给每个有创意的你

若开发 Issue 列表中没有你感兴趣的任务,可进入自主开发通道:添加公众号社区小助手 “StarRocks-1”,沟通提交自主开发任务需求的 Issue,社区评委团会评估判断是否邀请你加入 Geek 营任务中来。

如果获得通过,你将自主开发完成该项任务,孤胆英雄彰显硬核实力!(当然在你需要援手的时候,社区会毫不犹豫拉你一把)

荣誉和嘉奖,一个都不能少

为了嘉奖最终顺利完成极客营任务的同学,社区准备了极具纪念意义的限量版定制银牌(分量不轻)和神秘奖品(数量不少),并授予“极客贡献者”与“极客挑战者”称号!独乐乐不如众乐乐,何不邀请上三五好友与同事,一起享受冲关打怪升级的乐趣!

更多活动时间与流程细节

参看下方海报

StarRocks 极客营集结的号角已经吹响,赶快登陆 StarRocks Pinned issues 报名!Better Together!我们等你来!

点击“阅读原文”,前往 Github 了解任务详情

如希望了解更多详情请关注我们!

          联系电话:010-53322390

          商务合作:bd@starrocks.com

以上是关于重磅来袭:Spring之RequestBody的使用姿势小结的主要内容,如果未能解决你的问题,请参考以下文章

“StarRocks 极客营” 重磅来袭,和技术大牛一起推开数据库梦想之门!

“StarRocks 极客营” 重磅来袭,和技术大牛一起推开数据库梦想之门!

软件测试之接口测试核心-URL&amp;amp;HTTP协议详解重磅来袭,转发收藏

Spring MVC之@RequestBody, @ResponseBody 详解

180730-Spring之RequestBody的使用姿势小结

Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解