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
,会遇到以下问题:
- 参数值为 null:因为参数不在 URL 或表单中。
- 类型不匹配:例如
chartDataURLS
被序列化为 JSON 字符串,需要反序列化处理。 - 复杂结构:
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 的常见做法。