vue使用axios发送post请求携带json body参数,后端使用@RequestBody进行接收

博主在项目中使用原生axios发送post请求实现新增用户场景时踩了不少坑。先介绍接口定义,接着给出前端代码,发送请求后发现后端接收不到数据。经分析,是数据被花括号包起来所致,去掉后问题解决。还提到尝试用qs转换表单数据,与参数转换问题无关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近在做自己项目中,做一个非常简单的新增用户场景,但是使用原生axios发送post请求的时候,还是踩了不少坑的。

唉,说多了都是泪,小小一个新增业务,在自己前后端一起开发的时候,硬是搞了好久。

下面就把问题总结分享下,防止后人再踩坑。

接口定义

首先先看下我的接口定义吧。

其实就是一个很简单的新增,参数也不复杂。只是一个json实体的user对象

  @PostMapping(value = "/save")
    public Result save(@RequestBody User user) {
        return Result.ok(userService.saveUser(user));
    }

在这里插入图片描述

起初我用apifox是这么调用的,直接在json body里面写参数和值:

在这里插入图片描述

后端也是正常接收的:

在这里插入图片描述

ok,其实到了这我心里一阵暗爽,这不就妥了嘛,前端随便写点传进来不就完事了,但是还真不是这么简单!

前端代码

先看下我的业务吧,就是点击新增按钮跳出来一个表单,填写信息提交后端

在这里插入图片描述

我现在使用的是原生的axios,还没进行封装,我的很多坑都是因为原生导致的。我打算做完这个模块再进行封装,先体验下原生的感觉。

首先我是这么写的:

这里可以简单说下

发送get请求都是传递param,发送post请求都是传递data

由于我发送请求之前就把表单数据定义成一个叫data的变量,完整写法应该是:

data:data // 由于key和value一致,可以简写为data

在这里插入图片描述

 // 新增用户信息
    saveUserInfo(){
        let data = this.ruleForm;
        axios.post('http://localhost:9090/user/save',{data},{
          headers: {
            "Content-Type":"application/json"
          },
         
      }).then(res =>{
          // 请求成功状态为200说明添加成功
          if(res.data.status===200){
            // 关闭用户新增表单弹窗
             this.dialogFormVisible=false,
             // 添加成功提示
            this.$message({showClose: true, message: '添加成功!',type: 'success', duration:2000,center:true});
            // 重新刷新列表数据
            this.queryUserList();
          }
        }).catch(error =>{
            console.log(error)
        })
    },

发送请求并发现问题

上面代码写完直接运行,直接通过network查看请求

在这里插入图片描述

仔细一看好像没有什么问题吧,但是我在后端打了断点,一看,我的数据没了:

在这里插入图片描述

解决问题

然后我仔细分析,发现是因为数据的外面报了一层data:{}结构,经过请教圈子里面的大佬,发现问题所在:

就是data被花括号包起来了,去掉即可解决问题!

在这里插入图片描述

saveUserInfo(){
        // 表单数据
        let data = this.ruleForm;
        axios.post('http://localhost:9090/user/save',data,{
          // json格式
          headers: {
            "Content-Type":"application/json"
          },
    },

再次运行,解决问题:

在这里插入图片描述

后端也正常接收数据了:

在这里插入图片描述

至此问题解决

小插曲

下面是一个小插曲,就是有朋友和我说需要用qs进行转换下表单数据,但是我试过了。和这个参数转换问题无关,

安装qs插件

直接执行命令:

npm install qs

这个包很小哇,安装起来很快的:

在这里插入图片描述

引用qs

安装完之后,就可以使用qs了,直接在文件中引用

// 引用qs
import qs from 'qs'

使用qs

引用qs完后,就可以使用它把对象格式化为一个字符串,一行代码即可

 // 使用qs对象格式化为一个字符串
        qs.stringify(this.ruleForm)

在这里插入图片描述

总结

感觉还是挺简单的,但是还是很有必要封装下。

解决问题一定要精确定位,要多尝试,这里引用艾克一句话送给大家:

我宁愿犯错,也不愿什么都不错

### 如何在HTTP POST请求传递文件参数 当涉及到通过HTTP POST请求发送文件时,通常会使用`multipart/form-data`编码类型来构建请求体。这种类型的表单数据允许客户端向服务器传输二进制文件以及文本字段。 #### 使用HTML和JavaScript实现文件上传 为了创建一个能够提交文件给服务器的应用程序,在前端部分可以通过设置HTML `<form>`标签的属性为`enctype="multipart/form-data"`并指定方法为POST来进行操作[^2]: ```html <form id="fileUploadForm" action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="myFile"/> <button type="submit">Submit</button> </form> <script> document.getElementById('fileUploadForm').addEventListener('submit', function(event){ event.preventDefault(); const formData = new FormData(this); fetch('/upload',{ method:'POST', body:formData, }) .then(response => response.json()) .then(data => { console.log('Success:', data); }) .catch((error) => { console.error('Error:', error); }); }); </script> ``` 上述代码片段展示了如何利用HTML表单配合JavaScript Fetch API发起带有文件参数POST请求。这里的关键在于使用了`FormData`对象收集来自表单的数据,并将其作为请求主体的一部分发送出去。 #### 后端接收文件 对于后端而言,如果采用的是Node.js环境下的Express框架,则可以借助于像`multer`这样的中间件来处理多部件形式的数据流,从而轻松解析上传过来的文件[^3]: ```javascript const express = require('express'); const multer = require('multer') const upload = multer({ dest: 'uploads/' }) let app = express() app.post('/upload', upload.single('myFile'), (req, res, next) => { // req.file 是 `myFile` 文件的信息 // req.body 将包含文本域的数据,如果有 }) ``` 这段脚本配置了一个简单的路由处理器用于接受文件上传请求,并指定了目标存储路径。一旦接收到文件,它会被保存至本地磁盘上的特定目录内等待进一步处理。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

水星国王

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

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

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

打赏作者

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

抵扣说明:

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

余额充值