阿里云函数计算HTTP触发器开发参考

HTTP触发器实现了将某个函数关联到一个 URL 上(包含相应的 CRUD 操作),它可以接收 HTTP 请求,根据 HTTP 方法、URL,找到匹配的函数将 HTTP 相关信息传入并执行函数,获取执行结果,将函数执行结果包装为 HTTP 返回响应。创建HTTP触发器的核心步骤包括HTTP触发器配置用户代码配置,以下将为您分别介绍。

阿里云函数计算开通地址 https://www.aliyun.com/product/fc
阿里云函数计算官方开发文档 https://help.aliyun.com/product/50980.html

阿里云函数计算HTTP触发器参数配置

URL路径规则

URL参数的配置支持以下几种格式:

  1. 简单URL,不包含参数,例如:/user。
  2. 带参数的URL,使用{param}指定路径参数,例如 /user/{id}/posts 中,{id} 即为匹配参数。当请求 /user/123/posts 时,会识别参数id: 123。
  3. 带贪婪匹配路径参数的URL,使用{param+}指定贪婪匹配路径参数,它会匹配当前位置直到 URL 结尾的所有剩余部分,例如 /path/{filepath+}。例如请求 /file/aaa/bbb/cccddd时,会识别参数 file: aaa/bbb/cccddd。

HTTP方法

HTTP 触发器支持DELETE、GET、HEAD、OPTIONS、PATCH、POST、PUT方式触发函数。HTTP触发器时可以选择多个,之后触发器会匹配相应的请求方法集合。

身份验证

可以选择不验证,或者IAM验证。选择不验证时,会在最终的触发器信息显示中显示 不验证。

用户代码中的配置

在用户代码中需要设置响应的handler来处理由HTTP触发器转发而来的请求,HTTP触发器可以将整个客户端请求映射到后端函数的输入 event 参数。参数的说明如下。

event的格式
Event:{"resource": "请求的资源路径", "path": "HTTP触发器的路径", "httpMethod": "请求的HTTP方法", "headers": {请求头}, "queryStringParameters": {query string 参数}, "pathParameters": {代理路径参数}, "requestContext": {请求上下文}, "body": "请求体", "isBase64Encoded": "请求体是否为Base64编码,这里固定为false,暂不支持二进制格式" }

其中请求头包括一个自定义头来标识请求:

{"X-Bce-Request-Id": "6c2d4826-xxxx-4c2b-8039-9ca98ded6954"}

说明:用户代码可依赖Event中现有参数,但HTTP触发器在将来可能增加参数,用户代码在此处需保证开放性,并对参数数量无硬性依赖。

配置举例

当配置了参数为如下内容的一个HTTP触发器之后

URL路径: "http://7grmt1xfky5jf.cfc-execute.gz.baidubce.com/test/{proxy+}"HTTP方法: GET 身份验证: 不验证

向该触发器发出请求

curl http://7grmt1xfky5jf.cfc-execute.gz.baidubce.com/test/aaa/bbb?a=111

对应的event的内容为

{"resource": "/test/{proxy+}","path": "/test/aaa/bbb.","httpMethod": "GET","headers": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8","Accept-Encoding": "gzip, deflate, br","Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8","Connection": "close","Upgrade-Insecure-Requests": "1","User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36","X-Bce-Request-Id": "f6cb833e-f818-4b80-b30c-fff437e69886" },"queryStringParameters": {"a": "111" },"pathParameters": {"proxy": "aaa/bbb." },"requestContext": {"stage": "cfc","requestId": "f6cb833e-f818-4b80-b30c-fff437e69886","resourcePath": "/test/{proxy+}","httpMethod": "GET","apiId": "7grmt1xfky5jf", "sourceIp": "12.34.56.78", },"body": "","isBase64Encoded": false}

HTTP 触发器的接口形式

使用HTTP触发器需要后端处理函数按照以下 JSON 格式返回输出:

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

返回输出中如果不需要任何响应头的时候,headers可以缺省为空。如果需要启用 CORS,必须在headers中添加 Access-Control-Allow-Origin:domain-name 。其中,domain-name 可以设置成通配符*。body为返回至客户端的响应中的响应体,当 body 是二进制格式的时候,可以指定isBase64Encoded为true,并将body编码为Base64格式;当body为非二进制格式时,可以指定isBaseEncoded为false。

Node.js 范例

exports.handler = (event, context, callback) => {callback(null, { "isBase64Encoded": false, "statusCode": 200, "headers": { "X-Custom-Header": "headerValue" }, "body": "hello"});};

Python 范例

import jsondef handler(event, context): resp = { "isBase64Encoded": False, "statusCode": 200, "headers": { "X-Custom-Header": "headerValue" }, "body": "hello" } return json.dumps(resp)