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

注意 当开启某一函数的 HTTP触发功能后,只要使用 HTTP请求就可以访问到函数,开发者需要关注业务安全和资源安全。
  • 业务安全:开发者需在云函数代码中做好权限控制和安全防护,避免未授权访问触发敏感操作。
  • 资源安全:云函数开启了 HTTP 访问后,如果遇到大量恶意访问,消耗云函数资源,开发者可以将云函数的触发路径设置为空或关掉该Space的HTTP触发功能,停止HTTP触发支持。

开启方法

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

  • 开启Space的HTTP触发功能

    调用接口 UpdateHttpTriggerConfig接口来开启Space的HTTP触发功能,注意需要设置EnableServicetrue

    系统会为开启HTTP触发功能的Space分配一个默认域名(DefaultEndpoint),供HTTP触发使用。

  • 开启云函数的HTTP触发功能

    调用接口 UpdateFunction接口来为云函数设置HTTP触发路径HttpTriggerPath,只有设置了触发路径的云函数才能使用该功能。

  • HTTP触发函数执行

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

限制说明

  1. 请求路径必须以/http开头,不能以/结尾,同一个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>