当前位置: 首页 > article >正文

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

目录

🎍序言

🌴传递单个参数

🍀传递多个参数

🎄传递对象

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

🚩@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.kler.cn/a/457606.html

相关文章:

  • 性能测试03|JMeter:断言、关联、web脚本录制
  • UE5失真材质
  • 简易Type-C拉取5V/3A电流电路分享
  • Java 数据库连接 - Sqlite
  • 我的桌面 1.9.75 | 个性化定制手机桌面,丰富的小组件和主题
  • “善弈者”也需妙手,Oclean欧可林:差异化不是说说而已
  • 总结TCP/IP四层模型
  • 机器学习基础-神经网络与深度学习
  • ID读卡器UDP协议Delphi7小程序开发
  • Java编程题_面向对象和常用API01_B级
  • 电动汽车用永磁同步电机控制系统研究与设计
  • Streamlining QA with Automated Testing for 3D Models
  • Vue计算属性、侦听器
  • 基于AI IDE 打造快速化的游戏LUA脚本的生成系统
  • 自学记录鸿蒙API 13:实现多目标识别Object Detection
  • 学习测试day1
  • ClickHouse 日常操作记录
  • 跟着问题学18——大模型基础transformer详解(2)多头自注意力机制
  • Linux 使用入门指南
  • 如何在 Spring Boot 中配置数据库?
  • 【bluedroid】A2dp Source播放流程源码分析(3)
  • C#控件开发2—流动管道
  • 小猫咪抽奖系统源码1.11(有卡密功能)
  • 【潜意识Java】探寻Java子类构造器的神秘面纱与独特魅力,深度学习子类构造器特点
  • 4. 指针和动态内存
  • Pytorch | 利用PC-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击