开启云函数HTTP触发功能

EMAS Serverless云函数支持由HTTP请求触发云函数调用的功能,本文介绍如何开启云函数HTTP触发功能。

重要

当开启某一函数的HTTP触发功能后,只要使用HTTP请求就可以访问到函数,开发者需要关注业务安全和资源安全。

  • 业务安全:开发者需在云函数代码中做好权限控制和安全防护,避免未授权访问触发敏感操作。

  • 资源安全:云函数开启了HTTP访问后,如果遇到大量恶意访问,消耗云函数资源,开发者可以将云函数的触发路径设置为空或关掉该服务空间的HTTP触发功能,停止HTTP触发支持。

开启方法

开启云函数HTTP触发功能,您需要开启Space的触发功能且配置云函数的HTTP触发路径。

  1. 开启Space的HTTP触发功能

    1. 登录EMAS管理控制台

    2. 查找您的项目,单击项目,进入EMAS概览页。

    3. 在顶部导航栏,选择平台服务

    4. 在左侧导航栏,选择

    5. 在界面右上角选择当前服务空间,如emasDev

    6. 单击HTTP触发配置页签,将HTTP触发设置右侧的更改状态设置为开启。系统会为开启HTTP触发功能的Space分配一个默认域名(DefaultEndpoint),供HTTP触发使用。

      fig33

  2. 开启云函数的HTTP触发功能

    1. 返回控制台主页,单击云函数列表页签。

    2. 选择任意一个云函数,单击函数名称,如test。打开云函数页面。

    3. 选择触发页签,单击HTTP路径触发右侧的编辑按钮。

    4. 编辑云函数页面,填写触发路径。如下图所示。

      fig34

  3. HTTP触发函数执行

    用户访问 https://${DefaultEndpoint}${HttpTriggerPath},即可触发对应的云函数执行。

限制说明

  1. 请求路径不能以/结尾,同一个Space下面的云函数的请求路径不能重复,请求路径只支持(/)、(-)、(_)、(.)、字母和数字组合,请求路径最长不超过128个字符。

  2. 请求方法仅支持以下四种,其余方法会被忽略。

    • GET

    • POST

    • PUT

    • DELETE

  3. 请求时Body的Content-Type仅支持以下三类,允许没有Body的请求,即没有Content-Type。其余Content-Type类型会被拒绝。

    • application/json

    • application/x-www-form-urlencoded

    • text/*

  4. 通过HTTP触发的响应,都会添加固定的Header,即Content-Disposition: attachment,此字段会使得返回结果在浏览器中以附件的方式下载。当前此字段无法覆盖,后续支持使用自定义域名之后,可以避免该问题。

  5. 请求Body大小限制,不能超过1M。

  6. 响应Body大小限制,不能超过1M。

云函数入参说明

在云函数中,通过ctx.args来获取请求时的内容。各参数的详细解释如下:

{
    path: 'HTTP请求路径,如 /hello',
    httpMethod: 'HTTP请求方法,如 GET',
    headers: {HTTP请求头,键值对形式},
    queryStringParameters: {HTTP请求的Query,键值对形式},
    body: 'HTTP请求体',
    isBase64Encoded: 'true or false,表示body是否为Base64编码,当前只会有false'
}

云函数返回值说明

云函数返回时,可以返回stringobjectnumberboolean等类型的数据,或者返回自定义响应,随后小程序Serverless会将返回值转化为正常的HTTP响应。

  • 返回string

    当服务端返回的Content-Typetext/plain

    例如云函数返回:

    'hello world!'

    则最终的响应为:

    HTTP/2 200
    date: Mon, 23 Mar 2020 10:12:41 GMT
    content-type: text/plain
    content-length: 12
    content-disposition: attachment
    request-id: ac14000d1584958361033101870
    hello world!
  • 返回objectnumberboolean

    当服务端返回的Content-Typeapplication/json

    例如云函数返回:

    {
        "keyString": "value1",
        "keyNumber": 1234
    }

    则最终的响应为:

    HTTP/1.1 200 OK
    Date: Mon, 23 Mar 2020 10:18:48 GMT
    Content-Type: application/json; charset=utf-8
    Content-Length: 39
    request-id: ac14000d1584958728277106170
    content-disposition: attachment
    {"keyString":"value1","keyNumber":1234}
  • 返回自定义响应

    服务端返回的Content-TypeHttpStatusCodeHeaders都由云函数来指定。

    要求云函数返回一个object,同时要设定mpserverlessComposedResponsetrue

    云函数的返回格式如下:

    {
        "mpserverlessComposedResponse": true,
        "isBase64Encoded": true|false,
        "statusCode": httpStatusCode,
        "headers": { "headerName": "headerValue", ... },
        "body": "..."
    }

    例如云函数返回:

    {
      mpserverlessComposedResponse: true,
      isBase64Encoded : false,
      statusCode: 200,
      headers: {
        'content-type': 'text/html'
      },
      body: '<h1>Hello World</h1>'
    }

    则最终的响应为:

    HTTP/2 200
    date: Mon, 23 Mar 2020 10:40:09 GMT
    content-type: text/html; charset=utf-8
    content-length: 20
    request-id: ac14000d1584960009970137070
    content-disposition: attachment
    <h1>Hello World</h1>