【问题标题】:Cloud Functions REST API: Creating a new action from a zip fileCloud Functions REST API:从 zip 文件创建新操作
【发布时间】:2019-05-16 14:46:15
【问题描述】:

我正在尝试使用以下 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 文件和通过 REST API 创建新操作的示例?谢谢。

【问题讨论】:

    标签: ibm-cloud ibm-cloud-functions


    【解决方案1】:

    您必须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
    

    完整代码

    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 install 并压缩文件zip -r action.zip *

    测试动作

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

    【讨论】:

    • 很棒的例子!我想知道要使用什么编码......现在我可以让它工作了,ty!
    【解决方案2】:

    IBM Cloud Functions API docs 中的REST API for creating or updating a Cloud Functions actions is documented。找出确切 curl / request 语法的一个好方法是在详细模式下使用IBM Cloud Functions CLI (-v)。 CLI 只是 REST API 的包装器,在详细模式下会打印所有 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 内容包含为codecurl docs 建议使用 @filename 来引用您的 zip 文件:

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

    【讨论】:

    • 谢谢,特别是详细模式的 -v 选项很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2018-12-14
    • 2023-03-08
    相关资源
    最近更新 更多