【问题标题】:NODE RED http request - post image via API (Face++)NODE RED http 请求 - 通过 API (Face++) 发布图像
【发布时间】:2018-04-02 18:59:04
【问题描述】:

我和this post有类似的问题

我通过文件缓冲区节点获取图像。如果此节点进入 ibm watson 的视觉识别节点,则可以正常工作。

我还想使用这张图片将其发布到另一个 API。因此,我使用 URL = https://api-us.faceplusplus.com/facepp/v3/detect

的 http 请求节点

在它前面,我使用一个函数节点来为这个 http 请求创建 headerbody。它工作得很好。但我无法将图像“附加”到它。

我不知道正确的语法。就是“image_file”那一行。

var image = msg.payload;
msg.headers = {};
msg.headers["content-type"] ='application/x-www-form-urlencoded';
msg.payload = {};
msg.payload['api_key'] = 'zrxC';
msg.payload['api_secret'] = 's3UN';
msg.payload['image_file'] = image;
msg.payload['return_landmark'] = '1';
msg.payload['return_attributes'] = 'gender,age,emotion,beauty,skinstatus';
return msg;

如果我使用不同的图像输入 (url),它可以工作。

msg.payload['image_url'] = 'http://picture.com/pic.jpg";

Soooo...语法;)

也许这也是一个问题,因为图像需要另一种内容类型。是否可以为不同的身体部位赋予不同的内容类型?

编辑:我尝试了多部分 http 请求...这是我的整个流程。

[{"id":"6c6e1506.29cf2c","type":"tab","label":"Flow 3","disabled":false,"info":""},{"id":"b84cd67b.aaaee8","type":"http response","z":"6c6e1506.29cf2c","name":"","x":971,"y":602,"wires":[]},{"id":"a220ce16.64fcb","type":"http in","z":"6c6e1506.29cf2c","name":"Get Home Page","url":"/homepage","method":"get","upload":false,"swaggerDoc":"","x":441,"y":590,"wires":[["c46a3f0a.a30cb"]]},{"id":"c46a3f0a.a30cb","type":"template","z":"6c6e1506.29cf2c","name":"Form and Response Template","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":" <html>\n     <body>\n        <form action=\"/classify\" method=\"post\" enctype=\"multipart/form-data\">\n            <input type=\"file\" name=\"pic\" accept=\"image/*\"><br>\n            <input type=\"submit\" value=\"Submit\">\n        </form> \n        <div>Classifications:</div>\n        <div>\n            {{#result}}\n            <table>\n            <tr>\n                <th>Class</th>\n                <th>Score</th>\n                <th>Type</th>\n            </tr>\n            {{#images}}\n            {{#.}}\n            {{#classifiers}}\n            {{#.}}\n            {{#classes}}\n            {{#.}}\n                <tr>\n                    <td>{{class}}</td>\n                    <td>{{score}}</td> \n                    <td>{{&type_hierarchy}}</td>\n                </tr>                \n            {{/.}} \n            {{/classes}}            \n            {{/.}}            \n            {{/classifiers}}\n            {{/.}}\n            {{/images}}\n            </table>\n            {{/result}}\n        </div>\n     </body>\n</html>","x":720.5,"y":600,"wires":[["b84cd67b.aaaee8"]]},{"id":"ee17076b.7b9038","type":"function","z":"6c6e1506.29cf2c","name":" Determine File Path","func":"if (msg.req.files) {\n    var files = Object.keys(msg.req.files);\n    msg.payload = msg.req.files[files[0]][0].path;    \n}\nreturn msg;","outputs":1,"noerr":0,"x":321.5,"y":737,"wires":[["d8385fe9.3b5d4"]]},{"id":"b4bcb13e.bd4a","type":"visual-recognition-v3","z":"6c6e1506.29cf2c","name":"","apikey":"3738dbb4a5ae703eb3d23285127f8a21233e6566","image-feature":"classifyImage","lang":"en","x":701,"y":716,"wires":[["95fdb967.895c98","c46a3f0a.a30cb"]]},{"id":"95fdb967.895c98","type":"debug","z":"6c6e1506.29cf2c","name":"","active":true,"tosidebar":true,"console":false,"complete":"result","x":912.5,"y":760,"wires":[]},{"id":"d8385fe9.3b5d4","type":"file-buffer","z":"6c6e1506.29cf2c","name":"","mode":"asBuffer","x":511,"y":793,"wires":[["b4bcb13e.bd4a","7b398291.92ee0c"]]},{"id":"5c0e525d.d8230c","type":"httpInMultipart","z":"6c6e1506.29cf2c","name":"Classify Image","url":"/classify","method":"post","fields":"[{ \"name\":\"pic\"}]","swaggerDoc":"","x":117,"y":774,"wires":[["ee17076b.7b9038"]]},{"id":"4d5c181f.bdcbe8","type":"http request","z":"6c6e1506.29cf2c","name":"face++","method":"POST","ret":"obj","url":"https://api-us.faceplusplus.com/facepp/v3/detect","tls":"","x":797,"y":928,"wires":[["11b9d42c.ae40ec"]]},{"id":"11b9d42c.ae40ec","type":"debug","z":"6c6e1506.29cf2c","name":"","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"payload","x":1005,"y":927,"wires":[]},{"id":"7b398291.92ee0c","type":"function","z":"6c6e1506.29cf2c","name":"set payload and headers","func":"var image = msg.payload;\n\n\nmsg.headers = {};\nmsg.headers[\"content-type\"] ='application/x-www-form-urlencoded';\n\nmsg.payload = {};\nmsg.payload['api_key'] = 'z8lK8AM2u7X9CfI5PodNcFYv0OPq3rxC';\nmsg.payload['api_secret'] = 's33uL-coCxnDZn_naWMceZh-Xko1QSUN';\nmsg.payload['image_file'] = [image]; \nmsg.payload['return_landmark'] = '1';\nmsg.payload['return_attributes'] = 'gender,age,emotion,beauty,skinstatus';\n\n\nreturn msg;\n","outputs":1,"noerr":0,"x":560,"y":933,"wires":[["4d5c181f.bdcbe8"]]}]

我的问题是将图像发送到红色突出显示的 API。

【问题讨论】:

  • Nick (@knolleary) 在您之前的问题中指出,您需要使用 node-red-contrib-http-request-multipart 来处理此类请求。
  • 是的,但是对于那个节点,我也无法使用正确的语法来正确处理缓冲区节点的图像。
  • 但是你没有展示你尝试过的东西
  • 我尝试了here给出的解释...之后我编辑了我的原始帖子并添加了我当前的流程。

标签: http request nodes node-red


【解决方案1】:

要将缓冲区作为字段推送,您需要使用node-red-contrib-http-request-multipart 将标头中的content-type 设置为multipart/form-data

那么您需要确保msg.payload 对象与request 节点所需的输入相匹配:

var image = msg.payload;
msg.headers = {};
msg.headers["content-type"] ='multipart/form-data';
msg.payload = {};
msg.payload['api_key'] = 'zrxC';
msg.payload['api_secret'] = 's3UN';
msg.payload['image_file'] = image;
msg.payload['return_landmark'] = '1';
msg.payload['return_attributes'] = 'gender,age,emotion,beauty,skinstatus';
return msg;

【讨论】:

  • 如果我将内容类型更改为“multipart/form-data”,我会得到:error_message:“MISSING_ARGUMENTS:api_key”如果我留在“application/x-www-form-urlencoded” api连接有效,但上传时卡住了:“MISSING_ARGUMENTS: image_url, image_file, image_base64”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 2011-09-28
  • 1970-01-01
  • 2017-03-28
相关资源
最近更新 更多