【JavaEE进阶】Spring传递请求参数

server/2024/12/31 20:21:41/

目录

🎍序言

🌴传递单个参数

🍀传递多个参数

🎄传递对象

🌳后端参数重命名(后端参数映射)

🚩@ReuqestParam注解


🎍序言

访问不同的路径,就是发送不同的请求.在发送请求时,可能会带⼀些参数,所以我们在学习Spring的请求时,主要是学习如何传递参数到后端以及后端如何接收.

下面会对传递参数进行一个详解,咱们主要是使⽤浏览器和Postman来模拟

注:上篇文章聊了RequestMapping之后,之后在类上都加上RequestMapping,防止同一类中不同的方法使用同一请求方式的注解并且路径相同,就会报错

🌴传递单个参数

代码:

站在前端的角度:现在一般都是前后端分离,前端并不关心后端如何接收,只需要把参数传递过去就可以了,只需知道key是什么,value的一个格式即可。前后端交互,交互的是url,请求方法,请求参数。

站在后端的角度:也不需要关系前端怎么传过来,只需要接收即可。后端接收参数也只能加在方法上。

Postman传参:可以使用Params传,也可使用Body中的form表单的方式

使用Params传递:

当后端收到这个url,Spring就自动的帮我们绑定到这个方法里面了。

若我们修改一下key:此时后端收到这个url时,Spring发现没有地方要userName1,也就是说userName没有收到传递过来的参数,赋值为null

使用Body的form表单传参:注意将Params中的参数勾选掉。通过Body的form表单传输发现url没有拼接key,value的值。注意通过Body传参要使用Post请求

通过Fiddler抓取两种方式对比:

通过浏览器传参:

如果使⽤基本类型来接收参数时,参数必须传(除boolean类型),否则会报500错误:

小结:总之后端并不关心前端通过什么样的方式来调用我的接口。如果参数传递不一致,比如后端需要接收一个String类型,你传了19,此时Spring就会帮我自动的转过去,若转不了,例如后端需要接收一个Integer类型,你传了一个字符串,就会报400,并且后端会有错误日志。

传递包装类型和基本类型的差异:

代码:

传参结果:

不传参结果:

观察发现如果使⽤基本类型来接收参数时,参数必须传(除boolean类型),否则会报500错误,报的是服务器错误,简单的来说,未传值,相当于age=null,age又是一个int类型,int类型不能等于null,改成包装类型即可。后续在设计接口时,建议都使用包装类型

🍀传递多个参数

上述传递一个参数时,我们说后端是不需要关注前端的,现在我们传递多个参数,同样的后端也是不需要关注前端如何传的。

那么参数也不能加在注解上,还是声明在方法上即可。

代码:

传参结果:

即使我通过该变传参顺序也不影响:

原理:我们传过去的参数是一个key value的键值对,key是userName,value是zhangsan,类似一个Map这样的结构,Spring在接收的时候,它就会从这个Map里面去找key为userName的参数,找到了就把这个key的value映射(赋值)出来,没有就赋值为null。

有时候我们在设计完接口之后,在里面设计的参数只是当时够用,但是到后面发现此时的参数不够用了,还需要在添加一些参数,一种方式是直接在方法中直接添加,但是一般不建议,有一个开闭原则,也就是说在工作中,当前接口已经上线了,尽量不要去修改,不确定会不会造成影响

方式二:再添加一个接口,让之前的业务切换到新接口上,让之前的接口慢慢的废弃掉(横杠)

但是方式二感觉又很麻烦,如果后续又加的话又要搞一个新的接口,此时我们就可以把这些参数封装成一个对象,直接传递对象即可。

🎄传递对象

封装对象:此时想要加参数直接再这个对象中加即可

通过String类型接收整个对象:

传参结果:​​​​​​​

通过UserInfo类型接收:

传参结果:

在上述传递单个参数是,如果是int类型,不进行传参的话会报500错误;当前将UserInfo中age类型改为int类型,看看不传参会发生什么。

传参结果:发现默认赋值为0

🌳后端参数重命名(后端参数映射)

比如以及告诉前端传过来的参数是userName,但是后端因为一些原因不想叫这个名字,就想用name去接收,该如何做?

代码:

传参结果:

🚩@ReuqestParam注解

就可以通过@ReuqestParam注解给后端参数进行重命名,将前端的UserName绑定给后端的name

代码:​​​​​​​

传参结果:此时就可以收到值了

当使用@ReuqestParam注解后(绑定name之后),前端不传userName,就会报400

那我们查看param4不传userName:

传参结果:此时userName为null

上述param6和param4的代码区别就是加了一个@ReuqestParam注解进行绑定,但是param6不传userName就报400了,也可以查看后端的错误日志

大概就是这个注解的原因了。

查看@ReuqestParam注解源码:里面有一个属性为required,默认值为true,也就是说加上这个注解之后,当前的这个参数默认值是一个必填项。

但是我们初衷只是想与前端进行绑定,不需要有这些要求,修改一下即可:

参数传递(还是不传userName):此时就为null了


http://www.ppmy.cn/server/154281.html

相关文章

如何在 Ubuntu 22.04 上安装 Elasticsearch

简介 在本教程中,你将学习如何在 Ubuntu 22.04 服务器上安装 Elasticsearch。此外,你还将学习如何使用 Elasticsearch REST API 索引和操作数据。 Elasticsearch 是一个基于 Apache Lucene Library 的免费分布式搜索和分析引擎。它是一个快速且可扩展的…

【落羽的落羽 C语言篇】自定义类型——联合体、枚举

文章目录 一、联合体1. 联合体类型的声明2. 联合体的特点3. 联合体的大小4. 联合体和结构体的对比 二、枚举1. 枚举类型的声明2. 枚举类型的优点 一、联合体 1. 联合体类型的声明 联合体像结构体一样,也是由一个或多个成员构成,这些成员可以是不同的类…

【大模型】wiki中文语料的word2vec模型构建

在自然语言处理(NLP)任务中,词向量(Word Embedding)是一个非常重要的概念。通过将词语映射到一个高维空间中,我们能够以向量的形式表达出词语之间的语义关系。Word2Vec作为一种流行的词向量学习方法&#x…

SPI接口

一、SPI总线 SPI接口是Motorola 首先提出的全双工三线/四线同步串行外围接口采用主从模式(Master Slave)架构。 时钟由Master控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后(MSB firs…

如何在centos系统上挂载U盘

在CentOS上挂载NTFS格式的U盘,需要执行一系列步骤,包括识别U盘设备、安装必要的软件、创建挂载点,并最终挂载U盘。以下是在CentOS上挂载NTFS格式U盘的详细步骤: 一、准备工作 确认CentOS版本: 确保你的CentOS系统已经安装并正常运行。不同版本的CentOS在命令和工具方面可能…

iDP3复现代码数据预处理全流程(二)——vis_dataset.py

vis_dataset.py 主要作用在于点云数据的可视化,并可以做一些简单的预处理 关键参数基本都在 vis_dataset.sh 中定义了,需要改动的仅以下两点: 1. 点云图像保存位置,因为 dataset_path 被设置为了绝对路径,因此需要相…

动态规划简介:爱的初体验

动态规划是一个让人欲仙欲死、死去活来的科目,茫然无措时让你痛不欲生,柳暗花明时让你喜不自胜。 小伙,不能啊! 你要心怀有爱,你要用全身心的爱来迎接今天,迎接动态规划。 一、动态规划的概念 动态规划…

不安全物联网的轻量级加密:综述

Abstract 本文综述了针对物联网(IoT)的轻量级加密解决方案。这项综述全面覆盖了从轻量级加密方案到不同类型分组密码的比较等多个方面。同时,还对硬件与软件解决方案之间的比较进行了讨论,并分析了当前最受信赖且研究最深入的分组…