前端数据与springboot java数据类型转换
springboot&mybatis中数组和字符串数据类型的转换-CSDN博客中曾经提到,在Spring Boot中,通过URL传参、payload中的key-value形式或json形式,将前端数据以字符串格式发送到后端,后端Web层控制器类(com.example.controller)中,根据使用的注解(比如@RequestBody)确定传参方式,并调用对应的内置类型转换器,来将前端传来的参数转换成相应的对象来接收这些数据 。本篇整理一下前端与springboot之间参数传递的几种常用注解和使用方式。
先从JMeter的三种请求形式说起
如果你熟悉JMeter,可以从这里看起,从自己熟悉的领域逐渐过渡到不熟悉的。如果不了解Jmeter,直接跳过,看springboot注解即可。
在JMeter Http post请求中,Header中的content-type有三种格式,分别为
支持key-value数据格式的application/x-www-form-urlencoded支持json数据格式的application/json支持各种混合数据格式,以表单形式提交的multipart/form-data那么,分别对应SpringBoot中的注解,分别为:
@RequestParam,@RequestBody,@RequestPart;另外,@PathVariable注解仅供Http get请求使用。
@PathVariable
基本用法
http get请求中,所有的参数都在URL中,以字符串形式传递,然而在Controller中,需要使用java类型去接收,这里使用@PathVariable注解。它用于将请求URL中的某个部分作为方法的参数进行传递。通常配合@RequestMapping注解一起使用,将URL中的变量值绑定到Java方法的参数上。
例如,假设我们有以下路径:/books/{id},其中{id}是要提取的参数值。
前端js:
export function getBookById(id) { return request({ url: '/books/' + id, method: 'get' })}
后端controller中我们可以使用@PathVariable注解将{id}绑定到Java方法的参数上,如下所示:
@GetMapping("/books/{id}") public String getBookById(@PathVariable("id") int bookId) { // 根据书籍ID获取书籍信息的逻辑处理 // ... return "book details"; }
在上面的代码中,@PathVariable("id")注解将URI路径中的{id}参数进行数据类型转换,并绑定到函数的id参数上。这样,当我们访问/books/123时,id参数将被设置为123。
传递多个参数
使用逗号分隔参数
在路径中使用逗号分隔多个参数,然后在方法的参数列表中使用@PathVariable注解分别获取这些参数。例如:
export function getUser(id1,id2) { return request({ url: '/users/' + id1+","+id2 method: 'get' })}
@GetMapping("/users/{id1},{id2}")public User getUser(@PathVariable("id1") Long id1, @PathVariable("id2") Long id2) { // 执行逻辑}
使用占位符{}传递多个参数
可以在路径中使用占位符{}传递多个参数,然后在方法的参数列表中使用@PathVariable注解获取这些参数,并使用@PathVariable注解的value属性指定参数名。例如:
export function getUser(id1,id2) { return request({ url: '/users/' + id1+"/"+id2, method: 'get' })}
@GetMapping("/users/{id1}/{id2}")public User getUser(@PathVariable("id1") Long id1, @PathVariable("id2") Long id2) { // 执行逻辑}
使用Map传递多个参数
可以使用Map来接收路径中的多个参数,其中Map的key为参数名,value为参数值。例如:
export function getUser(param) { return request({ url: '/users/' + param, method: 'get' })}
@GetMapping("/users/{param}")public User getUser(@PathVariable Map<String, String> param) { Long id1 = Long.valueOf(param.get("id1")); Long id2 = Long.valueOf(param.get("id2")); // 执行逻辑}
请求示例:GET /users/id1=1&id2=2
@RequestParam
基本用法
前面说过,@requestParam注解对应content-type中支持key-value数据格式的application/x-www-form-urlencoded,这种请求,参数有两种形式:
1、在URL中,但是使用?与前面的URI区分
2、在请求体中,但是是以key-value键值形式存在,而非json格式(区别于后面的@requestBody注解)
所以,前端axios中对应的参数为param。例如
export function getUser(param) { return request({ url: '/users', method: 'get', params: param })}
后端controller中:
@GetMapping("/users")public User getUser(@requestParam Long param) { // 执行逻辑}
需要传递多个参数时
1、列举
export function getUser(id1,id2) { return request({ url: '/users', method: 'get', params: {id1,id2} })}//controller中@GetMapping("/users")public User getUser(@requestParam Long id1,Long id2) { // 执行逻辑}
2、使用自定义的实体类
//调用let query = {userName: myName,userId: 1};this.getUser(query);//axios请求export function getUser(query) { return request({ url: '/users', method: 'get', params: query })}//controller中@GetMapping("/users")public User getUser(@requestParam myUser query) { String userName = query.getUserName(); Long userId = query.getUserId(); // 执行逻辑}
@RequestBody
但是对于需要传递更多参数的请求,大多使用json格式传递参数,此时,@requestParam就不能满足需求,需要使用@RequestBody了,此时,前端axios中需要使用data来传参,而不能用params了。
//调用let user = {userName: myName,userId: 1};this.addUser(user);//axios请求export function addUser(user) { return request({ url: '/addUser', method: 'post', data: user })}//controller中@PostMapping("/addUser")public User addUser(@requestBody myUser user) { String userName = user.getUserName(); Long userId = user.getUserId(); // 执行逻辑}
总结
get请求中,可以使用@pathVariable和@requestParam注解 当URL使用/url/{id}方式时,使用@pathVariable注解,从路径中获取参数。此时后端controller中是@GetMapping("/users/{id}")当URL使用/url?id=123方式时,使用@requestParam注解,从查询字符串中获取参数。此时后端controller中是@GetMapping("/users")post请求中,可以使用@requestParam和@requestBody @requestParam对应前端axios的参数为params@requestBody对应前端axios的参数为data使用时一定要注意前后端的对应