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

3

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

------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个回答

2
你不再需要使用multipart贡献节点。现在,开箱即用的http输入节点可以处理多部分文件上传。将方法设置为“POST”并勾选“文件上传”选项。文件可以在“message.req.files”中找到。
如果你想从Node-RED发送一个多部分POST请求到某个服务,则使用HTTP请求节点。节点信息面板中有如何操作的说明。以下是复制的内容,但最好检查节点信息面板本身,因为下面的文本可能会过时 -

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

"最初的回答"
 {
     "KEY": {
         "value": FILE_CONTENTS,
         "options": {
             "filename": "FILENAME"
         }
     } 
 } 

>KEY、FILE_CONTENTS和FILENAME的值应设置为相应的值。

以下是一个样例流程:

[{"id":"f7b0ae63.e74e5","type":"fileinject","z":"aacbc9d.6412c38","name":"","x":140,"y":160,"wires":[["5cb04348.8b9e2c"]]},{"id":"5cb04348.8b9e2c","type":"function","z":"aacbc9d.6412c38","name":"","func":"msg.headers = {\n    \"content-type\" : 'multipart/form-data'\n    };\nlet databuffer = msg.payload;\n\nmsg.payload = {\n    \"KEY\": {\n        \"value\": databuffer,\n        \"options\": {\n            \"filename\": \"myfile.png\"\n        }\n    }\n}\n\n\nreturn msg;","outputs":1,"noerr":0,"x":290,"y":160,"wires":[["f04784b6.9e3078"]]},{"id":"f04784b6.9e3078","type":"http request","z":"aacbc9d.6412c38","name":"","method":"POST","ret":"txt","paytoqs":false,"url":"myserver.mybluemix.net/file/input","tls":"","proxy":"","authType":"basic","x":450,"y":160,"wires":[["76de17b4.dc2de8"]]},{"id":"76de17b4.dc2de8","type":"debug","z":"aacbc9d.6412c38","name":"File has been sent","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":670,"y":160,"wires":[]}]

我正在寻找一种在Node-RED内部创建multipart/form-data请求的方法。我想你所指的是Node-RED作为请求的接收端。 - libzz
我已经修改了我的答案以反映这一点。 - chughts
看起来你描述的节点是node-red-contrib-http-request-multipart。我有一种印象,这个节点可能存在问题,因为节点属性没有正确显示。无论如何,我会试一下并马上回复你。 - libzz
不是的,这是原生的HTTP请求节点。你可以在Node-RED的标准安装中找到它。 - chughts
1
我的问题非常直接:我需要在Node-RED内部创建/生成一个多部分请求。你一直说要使用Http-in,但就主要问题而言,它根本解决不了任何问题。使用http-in意味着数据来自其他地方(例如文件上传),这并不是我正在处理的用例。 - libzz
显示剩余7条评论

1

看起来在HTTP请求节点上直接创建multipart/form-data请求尚不支持。但是,可以在函数节点上手动创建multipart负载,并将其提供给现成的HTTP请求节点。

基本上,向HTTP请求节点提供类似以下方式的有效负载(来自flows.nodered中的片段):

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;

多部分载荷的格式在discourse.nodered中进行了详细讨论。
flows.nodered中还提供了一个示例流程。

如果您正在运行旧版本的Node-RED,那么这个答案才有效。在更新的版本中,HTTP In和HTTP Request节点都可以处理多部分数据。您提供的示例流程链接使用了HTTP In节点中的新的多部分功能。 - chughts
正如我在你的回答中所评论的那样,这个问题不是关于处理(即接收)多部分请求的。相反,它是关于在Node-RED中创建多部分请求。事实上,我提供的链接是来自Node-RED的创作者的答案。所以如果我漏掉了什么,请告知一下。 - libzz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接