POST、GET、@RequestBody和@RequestParam区别

Postman传递@RequestBody注解的传参、Get请求如何传递List类型参数 如下: 阅读详情

@RequestParam

注解@RequestParam接收的参数是来自HTTP请求体或请求url的QueryString中。

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 编码格式。如下图所示: 033e6a4ecdbe4babe47cc8f24bffaf55.jpeg

但是这样不支持批量插入数据啊,如果改用 json 字符串来传值的话,类型设置为 application/json,点击发送的话,会报错,后台接收不到值,为 null。

但可以入参后再转换,参考如下:

@PostMapping("/ali-receive")
    public void aliReceive(@RequestParam("message") String message) {
                ReceiveLog receiveLog = JSON.parseObject(message, ReceiveLog.class);
 
    }

解决Spring/SpringBoot @RequestParam注解无法读取application/json格式数据:https://blog.youkuaiyun.com/weixin_42536015/article/details/106906055

@RequestParam 接受JSON的字符串:https://blog.youkuaiyun.com/qq_40470612/article/details/104225419

不推荐使用@RequestParam接收application/json,这时候就需要使用到@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层的写法如下图所示:4ff8328f6a61b5dbc30f639ac2b3a086.jpeg

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

91f6b3e1265f88a33494b7885232b021.jpeg

批量向表中插入两条数据,这里的 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>,具体代码如下图所示:bce54362d40b7e9c14493bbcd6e2a97e.jpeg

postman请求:

51272d0759cdd0d8a559b8afb1c13c04.jpeg

控制台输出:

61a2cb82bc361e12c2f8f6a10d19fcd5.jpeg

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

POST请求时

@RequestBody --> JSON字符串部分

@RequestParam --> 请求参数部分

application/json格局图

88753f88be93e9a1b3cd8b9f0785419b.jpeg

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

8687d0d8952a764ba4efe10564598328.jpeg

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时候不可用

@RequestParam

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

GET请求

@RequestBody

RequestBody -- Map / Object
GET请求中不可以使用@RequestBody

@RequestParam

(@RequestParam Map map)
在url中的?后面添加参数即可使用
(@RequestParam String waterEleId,@RequestParam String enterpriseName)
在url中的?后面添加参数即可使用
(@RequestParam Object object)
GET请求中不可以使用

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

98263c691ed77a2335340de4a68802f4.jpeg

举栗子

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

ad76fc60853ef473afd018ee20f99c24.jpeg

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

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

如果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) {
}

完整方法

/**
     * 导入
     */
    @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 = mulRequest.getParameter("content");
            ObjectMapper mapper = new ObjectMapper();
            mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 
//            boolean result = iInstallWorkOrder.upLoadFile(listFile);
            boolean result = true;
 
            return new ResponseObj<>(result, null);
        } catch (Exception ex) {
            System.out.println(ex.toString());
            return new ResponseObj<>(false, null);
        }
 
    }

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

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

c9cde2f884a2fab90f8d540d018f0cdb.png

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

18fd2560df57e06939ec5314407743a3.png

总结 ?在GET请求中,不能使用@RequestBody。 ?在POST请求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,对于参数转化的配置必须统一。可以使用多个@RequestParam获取数据,@RequestBody不可以 举个例子,在SpringMVC配置了HttpMessageConverters处理栈中,指定json转化的格式,如Date转成‘yyyy-MM-dd’,则参数接收对象包含的字段如果是Date类型,就只能让客户端传递年月日的格式,不能传时分秒。因为不同的接口,它的参数可能对时间参数有不同的格式要求,所以这样做会让客户端调用同事对参数的格式有点困惑,所以说扩展性不高。 如果使用@RequestParam来接受参数,可以在接受参数的model中设置@DateFormat指定所需要接受时间参数的格式。 另外,使用@RequestBody接受的参数是不会被Servlet转化统一放在request对象的Param参数集中,@RequestParam是可以的。

另外,还有一种应用场景,接口规范为resultful风格时,举个例子:如果要获取某个id下此条问题答案的查询次数的话,则后台就需要动态获取参数,其注解为@PathVariable,并且requestMapping中的value应为value="/{id}/queryNum",截图如下:

f0f62995d1d8a89754c82eec2d0d8f5d.png

原文链接:https://blog.youkuaiyun.com/qq_43842093/article/details/121312700

总结POST、GET @RequestBody和@RequestParam区别 There was an unexpected error (type=Bad Request, status=400) 总结POST、GET @RequestBody和@RequestParam区别 和解决There was an unexpected error (type=Bad Request, status=400) 阅读详情

相关推荐

基于YOLOv5与海康工业相机的高分辨率实时检测实践

本文详细介绍了基于YOLOv5与海康工业相机的高分辨率实时检测实践,通过优化相机配置、网络传输和YOLOv5模型适配,实现了每秒15帧以上的实时检测性能,缺陷识别准确率高达99.2%。特别适用于电子元件焊接点检测、精密齿轮齿痕检查等对微小缺陷敏感的场景。

weixin_30872499的博客 474

@RequestBody和@RequestParam区别

@RequestParam 注解@RequestParam接收的参数是来自requestHeader中,即请求头。 RequestParam可以接受简单类型的属性,也可以接受对象类型。 @RequestParam有三个配置参数: required表示是否必须,默认为true,必须。 defaultValue可设置请求参数的默认值。 value为接收url的参数名(相当于key值)。 @RequestParam用来处理Content-Type为application/x-www-fo...

Mick_^_^的博客 841

用VASPKIT+Quantum Espresso高效绘制能带图:从K点路径生成到可视化全流程

本文详细介绍了如何整合VASPKIT与Quantum Espresso(QE)软件,构建一套高效的能带计算与可视化工作流。通过VASPKIT自动化生成高对称K点路径,结合QE完成自洽与非自洽计算,并利用gnuplot绘制发表级能带图。该流程极大提升了材料电子结构研究的效率与可重复性,是进行DFT能带计算的实用指南。

weixin_29294975的博客 163

Http中post/get请求参数接收

form-data、x-www-form-urlencoded:不可以用@RequestBody;可以用@RequestParamapplication/json:json字符串部分可以用@RequestBody;url中的?后面参数可以用@RequestParam在GET请求中,不能使用@RequestBody。在POST请求,可以使用@RequestBody和@RequestParam;可以使用多个@RequestParam获取数据,@RequestBody不可以;

weixin_54828627的博客 1万+

宝骏kiwi 630 730 560 E100 E200 E300 310 510 610 330 530维修手册电路图资料线路图接线图更新

2020-2022年宝骏RS-3维修手册和电路图。2020-2022年宝骏RS-3维修手册和电路图。2019-2021年宝骏RC-6维修手册和电路图。2019-2021年宝骏RC-6维修手册和电路图。2019-2020年宝骏RS-5维修手册和电路图。2019-2020年宝骏RS-5维修手册和电路图。2019-2020年宝骏RM-5维修手册和电路图。2019-2020年宝骏RM-5维修手册和电路图。2019-2021年宝骏510维修手册和电路图。2019-2021年宝骏510维修手册和电路图。

weixin_45821055的博客 1771

从ResNet到EfficientNet:特征金字塔网络(FPN)在不同骨干网中的适配指南

本文深入探讨了特征金字塔网络(FPN)与ResNet、VGG、EfficientNet等主流骨干网络的适配策略。文章详细解析了FPN的核心原理,并针对不同骨干网络的特征提取特性,提供了通道对齐、参数量估算及迁移学习的系统化指南,旨在帮助开发者在目标检测等视觉任务中构建高性能、高效率的模型。

weixin_29047919的博客 220

post请求后台如何用@RequestParam接收

需要在ajax请求中设置 contentType: “application/x-www-form-urlencoded”

weixin_43981133的博客 2万+

合宙Air780EP速连OneNET:AT+MQTT应用指南

本文详细讲解了合宙Air780EP使用AT指令通过MQTT接入OneNET的过程。

2401_82812461的博客 1388

@RequestParam和@RequestBody的区别 (结合 Get/Post )

一、get方法 请求:例如http://127.0.01:1025/download?url=https://www.baidu.com&token=opera-dev 获取请求参数: 直接获取request 如: public String getHtml(HttpServletRequest request) {} 什么也不加,直接在方法中获取参数值 如: public String getHtml(String url, String token) {} 利用@R

cristianoxm的博客 1700

基于改进YOLOv5的小目标检测 | 添加CBAM注意机制 + 更换Neck网络之BiFPN + 增加高分辨率检测头

本文针对图像中小目标难以检测的问题,提出了一种基于YOLOv5的改进模型。在主干网络中,加入CBAM注意力模块增强网络特征提取能力;在颈部网络部分,使用BiFPN结构替换PANet结构,强化底层特征利用;在检测头部分,增加高分辨率检测头,改善对于微小目标的检测能力。本文算法在无人机数据集VisDrone2019数据集上进行了多次对比实验,结果表明本文算法可以有效地检测小目标。🌈

小哥谈 2937

计算机视觉教程2-3:图解双线性插值算法&最近邻插值算法

提出此算法的背景是基于图片的缩放,在图片缩放的过程中,实质上就是将原图像像素矩阵像素值,填到目标图像像素矩阵中,目标图像像素矩阵可能比原图像像素矩阵大(图片放大),也可能小(图片缩小)。我们假设图片的宽(WidthWidthWidth)和高(HeightHeightHeight)是按同比例缩放的,那么 srcXsrcWidth=dstXdstWidth\frac{srcX}{srcWidth}= \frac{dstX}{dstWidth}srcWidthsrcX​=dstWidthdstX​ ...

FRIGIDWINTER的博客 7282

在get/post请求中@PathVariable和@RequestBody 和 @Requestparam和HttpServletRequest 的区别

网上翻阅了很多博客,对四种参数做了总结。 @PathVariable 主要作用:映射URL绑定的占位符 带占位符的URL是 Spring3.0 新增的功能,URL中的 {xxx} 占位符可以通过 @PathVariable("xxx") 绑定到操作方法的入参中。 如: @RequestMapping("/user/{id}") public String testPathVariable(@PathVariable("id") String id){ System.out.print.

qq_45170669的博客 4705

把 SAP Event Mesh 讲透:从事件驱动架构到 SAP BTP 落地实践

摘要: SAP Event Mesh是SAP BTP上的云端消息与事件服务,支持企业构建解耦、弹性的应用架构。它通过异步通信模式(如发布/订阅)解决传统同步集成的痛点,如系统紧耦合、链路脆弱等问题。核心能力包括事件驱动通信、可靠消息投递(支持至少一次送达)、与SAP生态深度集成(如S/4HANA事件扩展)以及混合环境支持。典型场景包括订单处理、库存同步等,发布方只需发出业务事件,订阅方按需消费,避免系统间直接依赖,符合Clean Core理念。两种关键模式为广播式的Publish/Subscribe和定向的

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 116

[转](15条消息) POST、GET、@RequestBody和@RequestParam区别(转载请删除括号里的内容)

@RequestParam 注解@RequestParam接收的参数是来自HTTP请求体或请求url的QueryString中。 RequestParam可以接受简单类型的属性,也可以接受对象类型。 @RequestParam有三个配置参数: required 表示是否必须,默认为 true,必须。 defaultValue 可设置请求参数的默认值。 value 为接收url的参数名(相当于key值)。 @RequestParam用来处理 Content-Type 为 application/x

jiaoqi6132的博客 227

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

@RequestBody和@RequestParam注解区别

GET可以拥有请求体,RFC 文档中从来就没有说过 GET 没有请求体.RFC 只是说GET 意味着通过 URI 来识别资源。所以GET请求体中的数据一般都是不做处理的,有些 http 的 lib 里不让甚至直接不提供 GET 方法追加请求体的操作。POST请求拥有请求体,并且请求数据一般都是放在请求体当中的。所以在处理POST请求时,通常都是从请求体中获取数据。

Taytay1989_123的博客 163

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

@RequestParam和@RequestBody的区别,以及两者是否能同时使用

@RequestParam和@RequestBody的区别 @RequestParam 用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型) @RequestParam可以接受简单类型的属...

DCFANS的博客 2万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

@RequestParam和@PathVirable和@RequestBody区别

@RequestParam 使用@RequestParam接收前段参数比较方便,前端传参的URL: url = “${ctx}/main/mm/am/edit?Id=${Id}&name=${name}” 后端使用集合来接受参数,灵活性较好,如果url中没有对参数赋key值,后端在接收时,会根据参数值的类型附,赋一个初始key(String、long ……) @RequestMapping("/edit") public String edit(Model model, @Request

song854601134的博客 7355

SpringMvc--@RequestBody和@RequestParam注解以及不加注解接收参数的区别

1.@RequestParam 主要用来接收GET请求拼接在URL后的参数,或者是POST传递,且Content-type为x-www-form-urlencoded方式。 因为不管是GET方式还是用x-www-form-urlencoded方式传递,参数都是以键值对方式拼接的,然后经过URLencoded编码,传递给服务端。 @RequestParam只能接收简单参数类型 2.@RequestBody 使用@RequestBody该注解,前端请求只能为POST,因为该注解是从请求体中获得对象的。且请求头中

weixin_43606226的博客 5364
上一篇: Spring成神之路第十篇:primary可以解决什么问题?
下一篇: Spring成神之路第十一篇:bean中的autowire-candidate又是干什么的?
码趣资源网
博客等级 码龄4年 268粉丝 518原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值