技术标签: spring boot 毕设
注解@RequestParam接收的参数是来自requestHeader中,即请求头。
RequestParam可以接受简单类型的属性,也可以接受对象类型。
@RequestParam有三个配置参数:
required 表示是否必须,默认为 true,必须。
defaultValue 可设置请求参数的默认值。
value 为接收url的参数名(相当于key值)。
所以在postman中,要选择body的类型为 x-www-form-urlencoded,这样在headers中就自动变为了 Content-Type : application/x-www-form-urlencoded 编码格式。
但是这样不支持批量插入数据啊,如果改用 json 字符串来传值的话,类型设置为 application/json,点击发送的话,会报错,后台接收不到值,为 null。
这时候,注解@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。
上述示例是传递到实体类中的具体写法,那么如果传递到非实体类中,body里面的json数据需要怎么解析呢?我们再来看下面这个例子:
在body中,我们还是输入上面的json数据,根据分析,上面的json数据是一个List数组内嵌套着map对象,那么在后台的接收形式可写为 List<Map<String, String>>,具体代码如下图所示:
postman请求:
控制台输出:
得出结论,通过@RequestBody可以解析Body中json格式的数据。
?
?
@RequestBody --> JSON字符串部分
@RequestParam --> 请求参数部分
application/json格局图
form-data、x-www-form-urlencoded格局图
?
① form-data、x-www-form-urlencoded:不可以用@RequestBody;可以用@RequestParam。见postman的格局,这两种方式的时候没有json字符串部分。
② application/json:json字符串部分可以用@RequestBody;url中的?后面参数可以用@RequestParam。见postman的格局
?
(@RequestBody Map map)
(@RequestBody Object object)
application/json时候可用
form-data、x-www-form-urlencoded时候不可用
(@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都不可用
(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时可用
RequestBody -- Map / Object
GET请求中不可以使用@RequestBody
(@RequestParam Map map)
在url中的?后面添加参数即可使用
(@RequestParam String waterEleId,@RequestParam String enterpriseName)
在url中的?后面添加参数即可使用
(@RequestParam Object object)
GET请求中不可以使用
当使用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) {
}
如果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 <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"><</span><span class="token operator">></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"><</span><span class="token operator">></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>
按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不可以
在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",
参考:
@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
音频编解码技术的目标是,通过减少音频文件的大小来节省存储空间或减轻网络传输的负担。理想的情况下,即使音频被压缩,我们听到的声音与原版也应该没有任何区别。过去,已经有不少编解码技术被开发出来,满足了这些需求,比如Opus和EVS这两种编解码器就很出名。Opus是一个多才多艺的音频编解码器,它适用于各种应用,从视频会议(比如 Google Meet)到在线视频流(比如 YouTube)。Opus支持的压缩比率非常灵活,从每秒6千比特到每秒510千比特都可以。而EVS,是由针对移动>)开发的最新编解码器。
文章浏览阅读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
文章浏览阅读1.1k次。随着新发布的Xsolla与Freejam热门游戏Robocraft的合作关系达成,我们觉得是时候带大家回顾一下我们的合作过程和Robocraft的故事。我们和Freejam富有激情的成员聊了聊,做了一些采访,并了解到他们是如果将热门游戏从一个概念变成独立工作室的。可以为我们简单介绍一下Freejam的游戏和Robocraft么?Freejam成立20_freejam
文章浏览阅读671次。在实际工作当中经常会遇到像上面这样的布局,就是不确定li的个数,但是想让它在父元素内水平居中显示或是相对父元素两端对齐。先看基础的/p>这样只能靠左显示。解决方法目前搜集了三种:第一种:利用css3选择器:nth-child(n)设定最后一列li的margin-right值为0。这也是我第一反应想到的方法,添加/p>第二种:设置ul的margin-left为负值。这是从猫爷的博客看到的..._li里面字体向下移动
文章浏览阅读755次,点赞7次,收藏5次。在前面的章节中,简单的分析了android显示系统的框架,我们知道一个应用程序之中,存在一个或者多个buffer用来存放界面的数据,单应用程序构造好这些buffer之后,他会把这些buffer发送给surfaceFlinger,由surfaceFlinger决定在合适的时候把buffer中的数据拷贝到framebuffer,这样才能在屏幕上显示界面。应用程序的buffer需要向surfaceFli......_surfaceflinger测式程序
随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势社会的发展和科学技术的进步,互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。互联网具有便利性,速度快,效率高,成本低等优点。因此,构建符合自己要求的操作系统是非常有意义的。本文从用户的功能要求出发,建立了外卖点餐系统 ,系统中的功能模块主要是实现管理员;
re.split()方法是根据正则表达式匹配将字符串进行分割,并以列表形式返回.跟字符串的split()方法用法类似.pattern: 模式字符串,分割字符 string:要匹配的字符串 maxsplit:可选参数,别是最大的拆分次数 flags:可选参数,比如re.I 不区分大小写.re.S使(.)能够匹配所有字符,包括换行符代码。
MEMS硅压阻压力传感器采用外围固定的圆形应力杯的硅膜内壁,利用MEMS技术在表面应力最大的地方直接雕刻四个高精度半导体应变片,形成惠斯通测量电桥,作为电电转换测量电路,将压力物理量直接转换为电能,测量精度可达0.01-0.03%FS。特定的故障代码,如“P01CA”(机油压力传感器电压高于上限),可以直接指向机油压力传感器的问题。正常情况下,传感器的输入端之间、输出端之间应有一定的电阻值,具体数值参照传感器的规格手册。然而,机油压力传感器,也称为机油压力开关或传感器,根据车辆的不同,其位置也不同。
文章浏览阅读823次,点赞24次,收藏16次。分簇协议LEACH和DEEC是两种常用的能源有效的传感器网络协议。它们都旨在延长传感器网络的生命周期并提高数据传输效率。在本文中,我们将对这两种协议进行仿真,并比较它们的生命周期和数据传输性能。LEACH(低能耗自适应簇头)是一种经典的分簇协议,它通过随机选择簇头来平衡能量消耗,并且在每个轮次中轮流选择新的簇头,以确保能量消耗均衡。DEEC(分布式能源有效的簇头)是LEACH的改进版本,它通过考虑节点的能量级别来选择簇头,并且引入了轮流选择簇头的机制,以进一步减少能量消耗。
文章浏览阅读5.8k次,点赞10次,收藏32次。计算机网络的认识一、计算机网络的概念定义:计算机网络就是互连的,自治的计算机的集合。互联网:网络的网络。Internet是最大互联网二、发展阶段第一阶段:从单个网络到ARPANET向互联网发展的过程第二阶段:三级结构的互联网第三阶段:逐渐形成多层次ISP结构的互联网三、组成计算机网络包括硬件、软件、协议三大部分硬件:主机(计算机),通信处理器,通信线路,交换设备;软件:各种..._谈一谈你对计算机网络的认识
文章浏览阅读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编程世界中,闭包(Closure)是一个强大而灵活的概念,它允许函数携带其定义时的环境信息,并在后续调用时访问这些信息。:在异步编程、事件驱动编程等场景中,回调函数是常见的模式。外部函数最后返回内部函数,这样当外部函数执行完毕后,内部函数(即闭包)仍然可以访问外部函数的变量。闭包的关键在于,它不仅仅是一个函数对象,它还包含了函数被定义时的环境信息,即词法环境。