Axios使用Post向Spring传递POJO对象的三种方法(@RequestBody与@RequestParam注解)

在开始前,先介绍一下下面这两个方法

JSON.stringify()

将对象变成json格式的字符串

  • 例:JSON.stringify({ id:1,name:“小明” })
    转换后就变为:{ “id”:“1”,“name”:“小明”}
this.$qs.stringify({})

将参数拼接为url传参的形式

  • 例:this.$qs.stringify({id:1,name:“小明”})
    转换后就变为:id=1&name=小明

(但实际上使用post方式传递时,参数值为中文时会进行url转码,否则会产生歧义)

一. 使用@RequestBody(传递单个对象适用)

Controller控制层使用@RequestBody注解接收对象参数时:

  1. Axios需设置响应头参数context-type为application/json,设置方式与ajax不同,需写在headers内。

  2. 使用JSON.stringify(对象),将需传递到后端的对象序列化成json格式的字符串。

this.$axios({
    method: 'post',
    url: '/queryUser',
    headers:{
    	'Context-Type': 'application/json' // 1
    },
    data: JSON.stringify(this.user) // 2
}).then((res) => {
    console.log(res.data)
});
  1. Controller需在形参对象前加上@RequestBody注解,因为注解带有反序列化机制,可将前端送来的json格式的字符串反序列化并一一映射为对象的属性,从而构成后端可直接使用的pojo对象
@RequestMapping(value = '/queryUser', method = RequestMethod.POST)
public void queryUser(@RequestBody User user) { // 3
	// user可直接使用
	System.out.print(user);
}

二. 使用@RequestParam(传递多个对象适用)

Controller控制层使用@RequestParam注解接收对象参数时:

  1. 在Axios中,先使用JSON.stringify()将需传递的对象转换为json格式的字符串,再使用this.$qs.stringify()转化为url传参形式的字符串
this.$axios({
    method: 'post',
    url: '/queryUser',
    data: this.$qs.stringify({  // 1
        user: JSON.stringify(this.user)
    })
}).then((res) => {
    console.log(res.data)
});
  1. Controller使用@ResquestParam注解,形参并不直接写pojo对象,而是Map< String,Object>对象,然后使用其get(“key”)方法得到前端作为url参数传递过来的json格式的object对象,使用toString转化为字符串后,利用第三方架包fastjson的JSON.ParseObject()将字符串转成后端直接使用的pojo对象
@RequestMapping(value = 'queryUser', method = RequestMethod.POST)
public void queryUser(@RequestParam Map<String, Object> param) { // 2
// get("key")方法得到前端作为url参数传递过来的json格式的object对象
Object o = param.get("user");
// toString转成字符串
String userStr = o.toString();
// 三方架包fastjson转pojo对象
User user = JSON.parseObject(userStr, User.class);
// 对象使用
System.out.print(user);

JSON.parseObject()的依赖

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>2.0.1</version>
</dependency>

若用此方法在Axios传递对象时,仅仅 this.$qs.stringify({user: this.user}),则会将user的每一个属性拆解拼接为url传参形式的串(user.id=1&user.name=小明),后端就获取不到完整对象了

三. 无注解(传递单个对象适用)

  1. 无需设置响应头
  2. axios使用this.$qs.stringify()
this.$axios({
    method: 'post',
    url: '/queryUser',
    data: this.$qs.stringify(user)
}).then((res) => {
    console.log(res.data)
});
  1. Controller形参处无需注解
@RequestMapping(value = '/queryUser', method = RequestMethod.POST)
public void queryUser(User user) {
	// user可直接使用
	System.out.print(user);
}

总结

单个pojo对象可使用第一种和第三种方法,多个不同的pojo对象则可使用第二种方法

文章参考博主简述 @insaneh

  • 9
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: axios是一种用于发送HTTP请求的JavaScript库。它提供了两种发送POST请求的方式:一种是通过请求体发送数据,另一种是通过URL参数发送数据。下面是对这两种方式以及前端axios发送请求与后端Spring Boot应用程序如何接收请求的解释。 1. 请求体方式: 通过axiospost方法发送POST请求时,可以将数据作为请求体的一部分发送给后端。在发送请求时,我们可以将数据以对象的形式传递axiospost方法。 例如,在前端使用axios发送请求: ```javascript axios.post('/api/user', { username: 'John', password: '123456' }) ``` 在后端的Spring Boot应用程序中,我们可以使用`@RequestBody`注解来接收请求体中的数据。通过该注解Spring Boot会自动将请求体中的JSON数据映射到对应的Java对象上。 例如,在后端的控制器中接收请求: ```java @PostMapping("/api/user") public ResponseEntity<?> createUser(@RequestBody User user) { // 处理接收到的用户数据 ... } ``` 2. URL参数方式: 通过axiospost方法发送POST请求时,也可以将数据作为URL参数的一部分发送给后端。在发送请求时,我们可以通过在URL中添加查询参数的方式将数据传递axiospost方法。 例如,在前端使用axios发送请求: ```javascript axios.post('/api/user?username=John&password=123456') ``` 在后端的Spring Boot应用程序中,我们可以使用`@RequestParam`注解来接收URL参数中的数据。 例如,在后端的控制器中接收请求: ```java @PostMapping("/api/user") public ResponseEntity<?> createUser(@RequestParam String username, @RequestParam String password) { // 处理接收到的用户名和密码 ... } ``` 这样,我们就可以通过axiospost方法以两种不同的方式发送POST请求,并通过`@RequestBody`或`@RequestParam`在后端的Spring Boot应用程序中接收请求数据。 ### 回答2: axios post请求方式有两种,一种是普通post请求,另一种是使用FormData对象进行post请求。这两种方式可以分别用@RequestParam@RequestBody接收请求参数。 普通post请求方式可以通过设置请求头`'Content-Type': 'application/json'`来发送json格式的数据,并使用axios的data参数传递请求参数。后端接口可以使用@RequestBody注解来接收请求参数。@RequestBody注解将请求体中的数据绑定到一个对象上,可以直接使用对象进行操作。 示例代码如下: 前端代码: ```javascript axios.post('/api/post', { key1: value1, key2: value2 }, { headers: { 'Content-Type': 'application/json' } }).then(response => { console.log(response.data); }).catch(error => { console.log(error); }); ``` 后端代码: ```java @RestController public class PostController { @PostMapping("/api/post") public ResponseEntity<?> handlePostRequest(@RequestBody PostData postData) { // 处理post请求参数 // ... return ResponseEntity.ok("Success"); } } public class PostData { private String key1; private String key2; // 省略getter和setter方法 } ``` 使用FormData对象进行post请求时,可以使用axios的data参数传递FormData对象。设置请求头`'Content-Type': 'multipart/form-data'`。后端接口可以使用@RequestParam注解来接收请求参数。@RequestParam注解用于获取请求参数的值。 示例代码如下: 前端代码: ```javascript const formData = new FormData(); formData.append('key1', value1); formData.append('key2', value2); axios.post('/api/post', formData, { headers: { 'Content-Type': 'multipart/form-data' } }).then(response => { console.log(response.data); }).catch(error => { console.log(error); }); ``` 后端代码: ```java @RestController public class PostController { @PostMapping("/api/post") public ResponseEntity<?> handlePostRequest(@RequestParam("key1") String key1, @RequestParam("key2") String key2) { // 处理post请求参数 // ... return ResponseEntity.ok("Success"); } } ``` 以上就是使用axios post发送两种请求方式,并使用@RequestParam@RequestBody接收请求参数的方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莉妮可丝的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值