Ibm cloud 云函数RESTAPI:从zip文件创建新操作

Ibm cloud 云函数RESTAPI:从zip文件创建新操作,ibm-cloud,ibm-cloud-functions,Ibm Cloud,Ibm Cloud Functions,我正在尝试使用以下curl从zip文件并通过REST API创建nodejs函数: curl --request PUT --url 'https://my:credentials@openwhisk.eu-gb.bluemix.net/api/v1/namespaces/mynamespace/actions/my_action_name?overwrite=true' --header 'accept: application/json' --header 'content-type: ap

我正在尝试使用以下curl从zip文件并通过REST API创建nodejs函数:

curl --request PUT --url 'https://my:credentials@openwhisk.eu-gb.bluemix.net/api/v1/namespaces/mynamespace/actions/my_action_name?overwrite=true' --header 'accept: application/json' --header 'content-type: application/json' --data '{"annotations":[{"key":"exec","value":"nodejs:10"},{"key":"web-export","value":true}],"exec":{"kind":"nodejs:10","init":"./action.zip"},"parameters":[{"key":"message","value":"Hello World"}]}'
因此,我得到一个错误:

"error":"The request content was malformed:\n'code' must be a string or attachment object defined in 'exec' for 'nodejs:10' actions"
有没有可能获得一个示例,说明如何从zip文件并通过restapi创建新操作?谢谢。

中的。找出确切的curl/request语法的一个好方法是在详细模式下使用(
-v
)。CLI只是RESTAPI的包装器,在详细模式下,所有REST细节都会打印出来

以下是可打印内容的相关部分:

Req Body
Body exceeds 1000 bytes and will be truncated
{"namespace":"_","name":"mytest/myaction","exec":{"kind":"nodejs:8","code":"UEsDBBQAAAAIAHJPhEzjlkxc8wYAAH8VAAALABwAX19tYWluX18ucHlVVAkAA+iFxFrohcRadXgLAAEE9AEAAAT0AQAAxVhtb9s2EP6uX8HRCCLBipb002DA69YkbYo17dZ0GwbDMGSKlrXJokfSToNh/313R+rNL2labJiK1iJ578/x7tTBgJ7A/QzYq8IuN3NmdbpYFIIZm9rC2EKYmiIYsB+1ynW6Ykqz1y9u2WWpNhl7uamELVTFrGJClaUUtha2LeQ9S6uMiVJVspYNgnDPWKVhb5lalqU2ZUXFUqZlmaKwtKTNeWpkzKp0JcsHdj
您需要将
binary
字段设置为true,并将zip内容包含为
code
。建议使用@filename引用您的zip文件:

如果要从文件中读取内容,请使用 内容


您必须base64编码.zip文件,然后将其作为
code
参数传递。我编写了一个shell脚本(bash)来编码并创建一个名为“action”的操作。将脚本另存为
create.sh
并执行脚本
/create.sh

#!/bin/sh
ACTION=action
ZIP=$ACTION.zip

base64 $ZIP | echo "\"$(cat)\"" | jq "{namespace:\"_\", name:\"$ACTION\", exec:{kind:\"nodejs:10\", code:., binary:true, main:\"main\"}}" | curl -X PUT -H "Content-Type:application/json"  -d @- https://USERNAME:PASSWORD@openwhisk.ng.bluemix.net/api/v1/namespaces/_/actions/$ACTION?overwrite=true
完整代码

function myAction(args) {
    const leftPad = require("left-pad")
    const lines = args.lines || [];
    return { padded: lines.map(l => leftPad(l, 30, ".")) }
}

exports.main = myAction;
app.js或index.js代码

function myAction(args) {
    const leftPad = require("left-pad")
    const lines = args.lines || [];
    return { padded: lines.map(l => leftPad(l, 30, ".")) }
}

exports.main = myAction;
package.json

{
  "name": "node",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "left-pad" : "1.1.3"
  }
}
运行
npm安装
并压缩文件
zip-r action.zip*

试一试

ibmcloud fn action invoke --result action --param lines "[\"and now\", \"for something completely\", \"different\" ]"

特别感谢您,详细模式的-v选项非常有用!真棒的例子!我想知道该用什么编码。。。现在我能成功了,泰!