HTTP触发器开发参考
HTTP触发器实现了将某个函数关联到一个 URL 上(包含相应的 CRUD 操作),它可以接收 HTTP 请求,根据 HTTP 方法、URL,找到匹配的函数将 HTTP 相关信息传入并执行函数,获取执行结果,将函数执行结果包装为 HTTP 返回响应。创建HTTP触发器的核心步骤包括HTTP触发器配置和用户代码配置,以下将为您分别介绍。
HTTP 触发器参数配置
创建 HTTP 触发器时,控制台中需要关注的主要配置项如下。
| 参数 | 必填 | 说明 |
|---|---|---|
| 选择事件源进行添加 | 是 | 选择 HTTP触发器 作为事件源。 |
| URL路径 | 是 | 定义请求访问路径,支持简单路径、路径参数和贪婪路径参数。 |
| HTTP方法 | 是 | 定义允许触发函数的 HTTP 方法,可同时选择多个方法。 |
| 身份验证 | 是 | 选择 不验证 或 IAM 验证。 |
| 使用二进制body | 否 | 启用后,请求体会以 Base64 形式写入 event.body,并将 event.isBase64Encoded 置为 true。 |
URL 路径规则
URL 参数支持以下格式:
- 简单 URL:
/user - 带路径参数的 URL:
/user/{id}/posts - 带贪婪匹配路径参数的 URL:
/path/{file+}
当 URL 中包含 {param} 时,HTTP 触发器会将命中的路径片段写入 pathParameters。当 URL 中包含 {param+} 时,会匹配当前位置到 URL 结尾的所有剩余路径,并写入对应的 pathParameters 字段。
HTTP 方法
HTTP 触发器支持 DELETE、GET、HEAD、OPTIONS、PATCH、POST、PUT 方式触发函数。创建 HTTP 触发器时可以同时选择多个方法,触发器会匹配所选方法集合中的请求。
身份验证
可以选择不验证,或者 IAM 验证。选择不验证时,会在最终的触发器信息中显示 不验证。
二进制请求 body
默认情况下,HTTP 触发器会以纯文本形式处理 HTTP 请求体。若请求体中包含非纯文本内容,并需要在函数中处理,可勾选 使用二进制body。勾选后,HTTP 触发器会使用 Base64 编码 HTTP 请求体,用户代码中 event.body 为 Base64 编码后的内容,event.isBase64Encoded 为 true。
在控制台中配置 HTTP 触发器时,可按以下步骤操作。
导航路径:函数计算 CFC->函数列表->目标函数->触发器->新增触发器
步骤 1:进入目标函数的触发器配置页
进入 函数列表 后,点击目标函数名称进入详情页,选择 【触发器】,再点击 【新增触发器】。
步骤 2:选择 HTTP 触发器并填写参数
在 选择事件源进行添加 下拉框中选择 HTTP触发器,再按需填写 URL路径、HTTP方法、身份验证 和 使用二进制body,然后点击 【确认】。
步骤 3:查看已创建的 HTTP 触发器
创建成功后,返回 【触发器】 列表,确认页面已经展示新建触发器的访问路径、HTTP 方法、身份验证方式和访问地址。若同一函数需要暴露多条路由,可继续点击 【新增触发器】,分别创建不同 URL 路径规则的 HTTP 触发器。
用户代码中的配置
在用户代码中需要设置响应的 handler 来处理由 HTTP 触发器转发而来的请求。HTTP 触发器会将整个客户端 HTTP 请求映射到后端函数的 event 参数中。
event 的格式
1{
2 "resource": "配置的 HTTP 触发器资源路径",
3 "path": "HTTP 请求的 URL 路径",
4 "httpMethod": "本次 HTTP 请求使用的 HTTP 方法",
5 "headers": {
6 "Header-Name": "headerValue"
7 },
8 "queryStringParameters": {
9 "key": "queryValue"
10 },
11 "pathParameters": {
12 "id": "pathValue"
13 },
14 "requestContext": {
15 "stage": "cfc",
16 "requestId": "requestId",
17 "resourcePath": "配置的 HTTP 触发器资源路径",
18 "httpMethod": "本次 HTTP 请求使用的 HTTP 方法",
19 "apiId": "apiId"
20 },
21 "body": "请求体内容",
22 "isBase64Encoded": false
23}
| 参数 | 必填 | 说明 | 示例 |
|---|---|---|---|
resource |
是 | 配置的 HTTP 触发器资源路径。 | /test/{proxy+} |
path |
是 | HTTP 请求的 URL 路径。 | /test/{proxyPath} |
httpMethod |
是 | HTTP 请求的方法。 | GET |
headers |
是 | HTTP 请求头列表,以键值对形式显示;当同一键存在多个值时,值之间使用逗号分隔。 | {"X-Bce-Request-Id":"{requestId}"} |
queryStringParameters |
否 | HTTP 请求的查询参数集合。 | {"key":"{queryValue}"} |
pathParameters |
否 | HTTP 请求的路径参数集合。 | {"id":"{pathValue}"} |
requestContext |
是 | 请求上下文对象,包含请求标识、资源路径、HTTP 方法等附加信息。 | {"requestId":"{requestId}"} |
requestContext.stage |
是 | 请求上下文字段,表明平台名称,默认是 cfc。 |
cfc |
requestContext.requestId |
是 | 请求上下文字段,表明请求 ID。 | {requestId} |
requestContext.resourcePath |
是 | 请求上下文字段,表明 HTTP 触发器设置的资源路径。 | /test/{proxy+} |
requestContext.httpMethod |
是 | 请求上下文字段,表明 HTTP 请求方法。 | GET |
requestContext.apiId |
是 | 请求上下文字段,表明 HTTP 请求 API ID。 | {apiId} |
body |
否 | HTTP 请求体。启用 使用二进制body 时,这里为 Base64 编码后的请求体内容。 | {bodyContent} |
isBase64Encoded |
是 | 请求体是否为 Base64 编码;启用 使用二进制body 时为 true,否则为 false。 |
false |
其中请求头包括一个自定义头来标识请求:
1{
2 "X-Bce-Request-Id": "requestId"
3}
函数计算 HTTP 请求映射逻辑
函数计算会将 HTTP 请求映射成 event 事件对象传给请求处理程序(Handler),映射逻辑如下:
- HTTP 请求头映射为
event.headers - HTTP 请求的查询参数映射为
event.queryStringParameters - HTTP 请求的路径参数映射为
event.pathParameters - HTTP 请求的上下文信息映射为
event.requestContext - HTTP 请求体映射为
event.body
说明: 用户代码可依赖 Event 中现有参数,但 HTTP 触发器在将来可能增加参数,用户代码在此处需保证开放性,并对参数数量无硬性依赖。
配置举例
导航路径:函数计算 CFC->函数列表->目标函数->函数代码;创建触发器时切换到 函数计算 CFC->函数列表->目标函数->触发器
- 在控制台为某个函数创建 URL 路径为
/test/{proxy+}、HTTP 方法为GET、身份验证为不验证的 HTTP 触发器,并记录访问地址。 -
使用
curl作为客户端向 HTTP 触发器发出请求。Bash1curl 'https://{endpointPrefix}/test/{proxyPath}?a={queryValue}' -
该请求在函数侧接收到的
event内容如下。JSON1{ 2 "resource": "/test/{proxy+}", 3 "path": "/test/{proxyPath}", 4 "httpMethod": "GET", 5 "headers": { 6 "Accept": "*/*", 7 "Connection": "close", 8 "User-Agent": "curl/{version}", 9 "X-Bce-Request-Id": "{requestId}" 10 }, 11 "queryStringParameters": { 12 "a": "{queryValue}" 13 }, 14 "pathParameters": { 15 "proxy": "{proxyPath}" 16 }, 17 "requestContext": { 18 "stage": "cfc", 19 "requestId": "{requestId}", 20 "resourcePath": "/test/{proxy+}", 21 "httpMethod": "GET", 22 "apiId": "{apiId}", 23 "sourceIp": "{sourceIp}" 24 }, 25 "body": "", 26 "isBase64Encoded": false 27}
使用 HTTP 触发器时的函数返回格式
HTTP 触发器支持两种格式的后端函数返回:简易格式和完整格式。
简易格式
HTTP 触发器会获取函数返回,并将其作为纯文本 HTTP 响应发回客户端。此时,响应状态码固定为 200,并包含 Content-Type: text/plain 响应头部。
使用简易格式时,无法在函数中自定义返回状态码和返回头部,也无法返回二进制响应。如果需要自定义这些内容,请使用完整格式返回。
Node.js 范例
1exports.handler = (event, context, callback) => {
2 callback(null, "response-body");
3};
完整格式
使用完整格式定义 HTTP 响应时,后端处理函数需要按照以下格式返回 JSON:
1{
2 "isBase64Encoded": true,
3 "statusCode": 200,
4 "headers": {
5 "Header-Name": "headerValue"
6 },
7 "body": "response-body"
8}
| 参数 | 必填 | 说明 |
|---|---|---|
isBase64Encoded |
是 | 表示 body 是否进行了 Base64 编码。返回纯文本时设为 false;返回二进制内容时设为 true,并先对 body 做 Base64 编码。 |
statusCode |
是 | HTTP 响应状态码。 |
headers |
否 | 以 K-V 形式定义响应中需要的额外头部,例如 Content-Type。 |
body |
是 | 返回给客户端的响应体内容。 |
如需启用 CORS,必须在 headers 中添加 Access-Control-Allow-Origin,其值可以设置为具体域名或通配符 *。当 isBase64Encoded 为 true 时,客户端收到的是解码后的二进制内容。
Node.js 范例
1exports.handler = (event, context, callback) => {
2 callback(null, {
3 "isBase64Encoded": false,
4 "statusCode": 200,
5 "headers": { "X-Custom-Header": "customValue" },
6 "body": "response-body"
7 });
8};
Python 范例
1import json
2
3def handler(event, context):
4 resp = {
5 "isBase64Encoded": False,
6 "statusCode": 200,
7 "headers": {
8 "X-Custom-Header": "customValue"
9 },
10 "body": "response-body"
11 }
12 return json.dumps(resp)
PHP 范例
1<?php
2function handler($event, $context) {
3 $resp = [
4 "isBase64Encoded" => FALSE,
5 "statusCode" => 200,
6 "headers" => [
7 "X-Custom-Header" => "customValue",
8 ],
9 "body" => "response-body",
10 ];
11 return json_encode($resp, JSON_FORCE_OBJECT);
12}
Lua 范例
1json = require('cjson')
2
3function handler(event, context)
4 respHeaders = {}
5 respHeaders["X-Custom-Header"] = "customValue"
6 resp = {
7 isBase64Encoded = false,
8 statusCode = 200,
9 headers = respHeaders,
10 body = "response-body",
11 }
12 return json.encode(resp)
13end
PowerShell 范例
1$respHeaders = @{}
2$respHeaders["X-Custom-Header"] = "customValue"
3$resp = @{
4 isBase64Encoded = $FALSE;
5 statusCode = 200;
6 headers = $respHeaders;
7 body = "response-body";
8}
9$respJson = $resp | ConvertTo-Json
10Write-Host $respJson
评价此篇文章
