最近在写一个前端的应用,需要调用后端的一个API HTTP POST接口,这个接口是接收multipart/form-data的,也就是会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来表名文件类型;content-disposition,用来说明字段的一些信息;由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。
以下是我要调用的后端接口的数据格式的例子,可以看到boundary是'--28319d96a8c54b529aa9159ad75edef9':
--28319d96a8c54b529aa9159ad75edef9
Content-Disposition: form-data; name="deployment-name"
aName
--28319d96a8c54b529aa9159ad75edef9
Content-Disposition: form-data; name="enable-duplicate-filtering"
true
--28319d96a8c54b529aa9159ad75edef9
Content-Disposition: form-data; name="deployment-source"
process application
--28319d96a8c54b529aa9159ad75edef9
Content-Disposition: form-data; name="deployment-activation-time"
2030-11-11T11:11:11.000+0200
--28319d96a8c54b529aa9159ad75edef9
Content-Disposition: form-data; name="data"; filename="test.bpmn"
<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions ...>
<!-- BPMN 2.0 XML omitted -->
</bpmn2:definitions>
--28319d96a8c54b529aa9159ad75edef9--
我的前端应用是根据用户输入的模型,产生了对应的XML代码,需要把这个XML代码上传给后端的接口。通常的做法是直接上传一个文件,但是我这里并没有生成一个文件,因此需要把XML的数据封装在一个文件中再上传。以下是代码片段,这里用axios来调用接口:
const file = new File([xml_data], "diagram.bpmn", {type: "text/plain"});
const data = new FormData();
data.append("deployment-name", process_name);
data.append("deployment-source", "process application");
data.append("data", file);
axios.post(
'http://localhost:8080/engine-rest/deployment/create',
data,
{headers: {'Content-Type':'multipart/form-data'}}
).then(
res=>{
console.log('res=>', res);
if (res.status==200) {
alert("部署成功,点击链接查看:"+res.data.links[0].href);
}
}
)
)