关于VUE3请求后端时,后端要用到Requestbody情况

  chartDataArray.push(chartDataURLC.value);
 chartDataArray.push(chart3DDataURL.value);
 const startTime= moment(timeLine.value[0]).format("YYYY-MM-DD");
 const endTime= moment(timeLine.value[1]).format("YYYY-MM-DD");
 const stationNum= searchData.value;
const deviceType= selectCode.value;
 const params = {
 startTime: startTime, // 替换为实际的日期
 endTime: endTime,   // 替换为实际的日期
 stationNum: stationNum, // 替换为实际的站点编号
 deviceType: deviceType,      // 替换为实际的设备类型
   chartDataURLS: JSON.stringify(chartDataArray)
   };
   const response = await axios({
 method: 'post',
 url: import.meta.env.VITE_APP_BASE_API + `/qc-api/getEquipmentWord`, // 替换为你的实际API地址
 data: params,
 responseType: 'blob',
});

这段请求后端必须用Requestbody才能收到参数

   public ResponseEntity<byte[]> getReportWord(
            @RequestBody ExportEquip exportEquip
            ) throws Exception {
    @ApiModelProperty(value = "开始时间", required = true, example = "2023-01-01 00:00:00")
    private LocalDate startTime;
    @ApiModelProperty(value = "结束时间", required = true, example = "2023-01-02 00:00:00")
    private LocalDate endTime;
    @ApiModelProperty(value = "设备Id", required = false, example = "")
    private String stationNum;
    @ApiModelProperty(value = "设备类型", required = true, example = "QC_wpr")
    private String deviceType;
    @ApiModelProperty(value = "圖片", required = true, example = "59134")
    private String chartDataURLS;

 原因是:

后端需要使用 @RequestBody 接收参数的根本原因是:​前端通过 axios 发送的 POST 请求将参数放在了 HTTP 请求体(Request Body)中,且数据格式默认是 JSON。以下是具体分析:


1. 参数传递方式分析

在你的代码中,前端通过以下方式发送请求:

const params = { 
  startTime: startTime,
  endTime: endTime,
  stationNum: stationNum,
  deviceType: deviceType,
  chartDataURLS: JSON.stringify(chartDataArray)
};

await axios({
  method: 'post',
  url: '...',
  data: params, // 参数放在请求体(Body)中
  responseType: 'blob',
});

关键点:

  • axios 默认会将 data 参数序列化为 ​JSON 格式,并设置 Content-Type: application/json
  • 参数没有通过 URL 的 query string(如 /api?key=value)或 form-data 传递,而是直接放在请求体中。

2. 后端接收参数的方式

后端框架(如 Spring Boot)需要根据参数传递方式选择对应的注解:

  • ​**@RequestParam 或 @ModelAttribute**:用于接收 URL 中的 query string 或 form-data 格式的参数。
  • ​**@RequestBody:用于解析请求体中的 ​JSON 或 XML 格式**的参数。

你的参数通过 JSON 放在请求体中,因此必须用 @RequestBody 接收。


3. 为什么不用其他方式?

如果后端尝试用 @RequestParam 或 @ModelAttribute,会遇到以下问题:

  1. 参数值为 null:因为参数不在 URL 或表单中。
  2. 类型不匹配:例如 chartDataURLS 被序列化为 JSON 字符串,需要反序列化处理。
  3. 复杂结构chartDataURLS 是数组的 JSON 字符串,需要解析为 Java 对象。

4. 解决方案对比

方案一:后端使用 @RequestBody(当前正确做法)
@PostMapping("/getEquipmentWord")
public ResponseEntity<?> getEquipmentWord(@RequestBody RequestParams params) {
    // 直接映射到对象
}
  • 优点:自动反序列化 JSON 到对象,支持复杂结构。
  • 缺点:需要定义对应的 Java DTO 类。
方案二:前端改用 form-data 格式发送

如果后端不想用 @RequestBody,前端需要修改:

const formData = new FormData();
formData.append('startTime', startTime);
formData.append('endTime', endTime);
// 其他参数同理...

await axios({
  method: 'post',
  url: '...',
  data: formData,
  headers: { 'Content-Type': 'multipart/form-data' },
});
  • 缺点:需要手动处理每个字段,无法直接传递复杂对象(如数组)。

5. 总结

  • 必须用 @RequestBody 的原因:前端通过 JSON 格式在请求体中传递参数。
  • 如果后端想改用其他方式(如 @RequestParam),前端需要调整参数传递方式(如 URL 参数或 form-data),但这会牺牲灵活性和开发效率。

建议保持当前设计,使用 @RequestBody 处理 JSON 请求体,这是 RESTful API 的常见做法。

### Vue3 中使用 Axios 进行 POST 请求并附带参数 在 Vue3 应用程序中,通过 `axios` 发起带有参数的 POST 请求是一个常见的操作。为了实现这一点,通常的做法是先安装 `axios` 和必要的依赖库(如果需要),然后按照特定的方式构建请求。 对于 POST 请求而言,除了 URL 外还需要提供两个主要部分:一个是作为请求主体的数据对象,另一个则是可选但常用的配置选项来指定诸如头部信息等内容类型等细节[^1]。当涉及到数组类型的参数或者其他复杂结构,则可能需要用到额外的方法来进行序列化处理以确保服务器能够正确解析这些数据[^2]。 下面给出一段具体的代码示例展示如何利用 `axios` 在 Vue3 中执行包含自定义参数的 POST 请求: #### 安装所需包 首先确保已经安装了 `axios` 及其辅助工具如 `querystring` 来帮助处理某些特殊场景下的参数编码问题: ```bash npm install axios querystring ``` #### 创建服务实例和服务方法 接着可以在项目的某个位置创建一个专门用来管理 API 调用的服务文件夹,在这里初始化 `axios` 并为其设定全局性的默认行为以及拦截逻辑,比如自动附加认证令牌或是统一错误提示等功能[^3]: ```javascript // src/utils/request.js import axios from &#39;axios&#39;; import qs from &#39;querystring&#39;; const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // 设置基础路径 timeout: 5000 // 设定超长 }); service.interceptors.request.use( config => { const token = localStorage.getItem(&#39;token&#39;); if (token) { config.headers[&#39;Authorization&#39;] = `Bearer ${token}`; } return config; }, error => Promise.reject(error) ); export default service; // 导出具体API调用函数供外部组件调用 export function postArticle(data) { return service.post(&#39;/api/articles&#39;, data); } ``` #### 使用封装好的 API 函数发起请求 最后就是在实际业务逻辑所在的 Vue 组件内部调用之前准备好的 API 方法,并传入相应的参数即可完成整个流程[^4]: ```html <template> <div> <!-- 表单或其他触发事件 --> </div> </template> <script setup> import { ref } from "vue"; import { postArticle } from "@/utils/request"; let articleTitle = ref(""); let content = ref(""); async function submitForm() { try { let response = await postArticle({ title: articleTitle.value, body: content.value }); console.log(response.data.id); // 假设后端返回新文章ID } catch (err) { console.error(err.message); } } </script> ``` 以上就是关于如何在 Vue3 中运用 `axios` 执行 POST 请求的同携带必要参数的一个基本指南。需要注意的是,根据实际情况的不同,特别是针对不同形式的数据提交需求(例如表单数据、JSON 数据或文件上传等情况),可能会有略微差异化的做法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值