如何在Node-RED中创建多部分HTTP请求

时间:2019-04-15 23:55:43

标签: multipartform-data node-red

我正在尝试发送包含以下表单数据的多部分请求:

------WebKitFormBoundaryjFqPRXY6RQpdTRvE
Content-Disposition: form-data; name="file"; filename="Sample.csv"
Content-Type: application/vnd.ms-excel


------WebKitFormBoundaryjFqPRXY6RQpdTRvE
Content-Disposition: form-data; name="data"; filename="blob"
Content-Type: application/json

{"name":"Sample5","type":"Csv","firstRowIsHeader":true,"columns":[{ ... }]}
------WebKitFormBoundaryjFqPRXY6RQpdTRvE--

以上数据通常是由Web服务创建和发送的。
我正在尝试从Node-RED复制完全相同的HTTP请求。
JSON数据已经准备好,因此只能创建多部分请求。

我尝试使用node-red-contrib-http-multipart,但我不确定如何配置。

[{"id":"e0fde1bd.e0aa","type":"httpInMultipart","z":"fc689d44.1c52","name":"","url":"/test/upload","method":"post","fields":"[ { \"name\": \"file\", \"maxCount\": 1}, { \"name\": \"data\", \"maxCount\": 1} ]","swaggerDoc":"","x":1390,"y":820,"wires":[["d109ed84.14d1d","8a39aaa0.6934c8","d0bc5b20.45f3a8"]]},{"id":"a2318dfd.bae7d","type":"http in","z":"fc689d44.1c52","name":"","url":"/test/send","method":"get","upload":false,"swaggerDoc":"","x":1380,"y":680,"wires":[["d7cfc418.89eb98"]]},{"id":"14c992f3.8652ad","type":"http response","z":"fc689d44.1c52","name":"","x":1750,"y":680,"wires":[]},{"id":"d109ed84.14d1d","type":"debug","z":"fc689d44.1c52","name":"","active":true,"console":"false","complete":"true","x":1570,"y":780,"wires":[]},{"id":"8a39aaa0.6934c8","type":"http response","z":"fc689d44.1c52","name":"","statusCode":"","headers":{},"x":1570,"y":860,"wires":[]},{"id":"1a646c83.8da7d3","type":"debug","z":"fc689d44.1c52","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":1790,"y":780,"wires":[]},{"id":"d7cfc418.89eb98","type":"template","z":"fc689d44.1c52","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<form action=\"/test/upload\" method=\"POST\" enctype=\"multipart/form-data\">\n  <div>\n    <input type=\"file\" name=\"file\">\n    <input type=\"submit\" value=\"Submit\">\n  </div>\n</form>","output":"str","x":1580,"y":680,"wires":[["2971b104.12737e","14c992f3.8652ad"]]},{"id":"d0bc5b20.45f3a8","type":"change","z":"fc689d44.1c52","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\t   \"file\": req.files.file[0].buffer,\t   \"data\": \"test\"\t}","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":1620,"y":820,"wires":[["1a646c83.8da7d3"]]},{"id":"2971b104.12737e","type":"debug","z":"fc689d44.1c52","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":1730,"y":640,"wires":[]}]

任何有关如何解决该问题的指针将不胜感激。

2 个答案:

答案 0 :(得分:1)

您不再需要多部分贡献节点。一段时间以来,开箱即用的http输入节点已经能够处理分段文件上传。

将方法设置为POST,然后选中file uploads选项。可以在message.req.files中找到文件。

如果您要从Node-RED向某个服务发送多部分POST请求,请使用HTTP Request节点。节点信息面板中的状态如何。复制如下,但最好检查节点信息面板本身,因为下面的文本可能会过时-

  

文件上传要执行文件上传,msg.headers [“ content-type”]   应该设置为multipart / form-data,并将msg.payload传递给   节点必须是具有以下结构的对象:

 {
     "KEY": {
         "value": FILE_CONTENTS,
         "options": {
             "filename": "FILENAME"
         }
     } 
 } 

>

  

KEY,FILE_CONTENTS和FILENAME的值应设置为>适当的值。

答案 1 :(得分:-1)

似乎尚不支持直接在HTTP请求节点上直接创建multipart / form-data请求。但是,可以在功能节点上手动创建多部分有效负载,并将其提供给现成的HTTP请求节点。

基本上,将这样的有效负载馈送到HTTP请求节点(来自here的片段):

msg.headers = {
    "Content-Type": "multipart/form-data; boundary=------------------------d74496d66958873e"
}


msg.payload = '--------------------------d74496d66958873e\r\n'+
'Content-Disposition: form-data; name="select"\r\n'+
'\r\n'+
'true\r\n'+
'--------------------------d74496d66958873e\r\n'+
'Content-Disposition: form-data; name="print"\r\n'+
'\r\n'+
'true\r\n'+
'--------------------------d74496d66958873e\r\n'+
'Content-Disposition: form-data; name="file"; filename="'+msg.filename+'"\r\n'+
'Content-Type: application/octet-stream\r\n'+
'\r\n'+
msg.payload+'\r\n'+
'--------------------------d74496d66958873e--\r\n';


return msg;

here对此进行了全面讨论。
here还提供了示例流程。