HTTP触发器通过发送HTTP请求触发函数执行,主要适用于快速构建Web服务等场景。本文介绍HTTP触发器的调用方式、协议支持、优势、CORS请求处理、使用限制及入口函数形式。
优势
HTTP触发器与API网关触发器均可应用于Web应用的创建。相较于API网关触发器,HTTP触发器有以下优势:
- 降低了开发人员的学习成本和简化了开发人员的调试过程,帮助开发人员快速使用函数计算搭建Web应用和API。
- 减少请求处理环节,HTTP触发器支持更高效的请求、响应格式,不需要编码或解码成JSON格式,性能更优。
- 支持选择熟悉的HTTP测试工具验证函数计算侧的功能和性能。
- 方便对接其他支持Webhook回调的服务,例如CDN回源、MNS等。
- 支持WebSocket协议。
触发方式
同步调用
HTTP触发器默认的函数调用方式为同步调用。
异步调用
触发HTTP函数时,您可以通过增加请求头"X-Fc-Invocation-Type":"Async"
的方式实现请求级别的异步调用。HTTP函数配置了异步任务后,可以通过增加请求头"X-Fc-Stateful-Async-Invocation-Id":"g6u*****iyvhd3jk8s6bhj0hh"
完成异步任务调用Invocation ID的配置。关于请求头的更多信息,请参见InvokeFunction。
异步调用成功后,函数计算会返回状态码202
,表示请求接收成功。同时会通过请求头返回Request ID和Stateful Invocation ID,格式如"X-Fc-Request-Id": "80bf7****281713e1", "X-Fc-Stateful-Async-Invocation-Id": "7522ba40****1c22e"
。
协议支持
- HTTP/HTTPS:支持GET、POST、PUT、DELETE、HEAD、PATCH和OPTIONS方式触发函数,适用于简单的请求-响应场景。
- WebSocket:支持GET方式触发函数,适用长连接、实时消息等场景。
CORS请求处理
函数计算系统默认允许HTTP函数的调用请求跨域访问,同时也支持用户在函数代码中自定义函数对跨域(即CORS)请求的处理行为。
简单请求
Access-Control-Allow-*
开头的Header,完成简单的访问控制。对于简单请求,函数计算支持自定义的Headers包括:
Access-Control-Allow-Origin
Access-Control-Allow-Headers
Access-Control-Request-Method
Access-Control-Max-Age
如果您没有自定义,则函数计算的Response Headers会默认设置为Request请求中相应的字段:
Access-Control-Allow-Origin
:Request请求的Origin HeaderAccess-Control-Allow-Credentials: true
Access-Control-Expose-Headers
:函数计算自定义的一些Headers
非简单请求
非简单请求在发送正式请求前会发送预检请求,即一次非简单请求包含一次OPTIONS方法的函数调用请求和一次实际的函数调用请求。正式请求的规则与上文的简单请求相同。如果您需要自定义预检请求的返回,则需要:
- 为HTTP触发器添加OPTIONS方法。
- 在函数代码中处理OPTIONS请求,即设置
Access-Control-Allow-*
开头的Header以控制函数的跨域行为。
对于预检请求,函数计算支持用户自定义的Headers包括:
Access-Control-Allow-Origin
Access-Control-Allow-Headers
Access-Control-Request-Method
Access-Control-Max-Age
exports.handler = (req, resp, context) => {
console.log('hello world');
if (req.method === 'OPTIONS') {
// Send response to OPTIONS requests
resp.setHeader('Access-Control-Allow-Origin', 'http://www.fc.com')
resp.setHeader('Access-Control-Allow-Methods', 'POST');
resp.setHeader('Access-Control-Allow-Headers', 'Content-Type');
resp.setHeader('Access-Control-Max-Age', '3600');
resp.setStatusCode(204)
resp.send('');
} else {
resp.send("hello world");
}
}
使用限制
触发器限制
HTTP协议使用限制
- HTTP Request限制
- Request Headers不支持以x-fc-开头的自定义字段和以下自定义字段:
- accept-encoding
- connection
- keep-alive
- proxy-authorization
- te
- trailer
- transfer-encoding
- 如果Request超过以下限制,会返回
400
状态码和InvalidArgument
错误码。- Headers大小:Headers中的所有Key和Value的总大小不得超过4 KB。
- Path大小:包括所有的Query Params,Path的总大小不得超过4 KB。
- Body大小:同步调用请求的Body的总大小不得超过16 MB,异步调用请求的Body的总大小不得超过128 KB。
- Request Headers不支持以x-fc-开头的自定义字段和以下自定义字段:
- HTTP Response限制
- Response Headers不支持以x-fc-开头的自定义字段和以下自定义字段:
- connection
- content-length
- content-encoding
- date
- keep-alive
- proxy-authenticate
- server
- trailer
- transfer-encoding
- upgrade
- content-disposition:attachment说明 从安全角度考虑,使用函数计算默认的aliyuncs.com域名,服务端会在Response Headers中强制添加content-disposition: attachment字段,此字段会使得返回结果在浏览器中以附件的方式下载。如果要移除该限制,需设置自定义域名。详细信息,请参见配置自定义域名。
- 如果Response超过以下限制,会返回
502
状态码和BadResponse
错误码。- Headers大小:Headers中的所有Key和Value的总大小不得超过4 KB。
- Response Headers不支持以x-fc-开头的自定义字段和以下自定义字段:
- 其他使用说明。
您可以通过绑定自定义域名,为HTTP函数映射不同的HTTP访问路径。详细信息,请参见配置自定义域名。您还可以使用API网关,后端服务类型选择HTTP服务,设置HTTP函数为后端服务地址,实现类似功能。详细信息,请参见使用函数计算作为API网关后端服务。
WebSocket协议使用限制
- Runtime支持:只有Custom Runtime和Custom Container支持WebSocket协议。
- 超时时间限制:WebSocket请求受函数配置的超时时间限制。
- WebSocket握手的Request限制:
- Request Headers不支持以x-fc-开头的自定义字段。
- Headers大小:Headers中的所有Key和Value的总大小不得超过4 KB。
- Path大小:包括所有的Query Params,Path的总大小不得超过4 KB。
- Body:WebSocket握手请求中不支持发送Body,即使发送,也会被函数计算系统忽略。
- WebSocket握手的Response限制:
Response Headers中所有Key和Value的总大小不得超过4 KB,否则会返回
502
状态码和BadResponse
错误码。 - WebSocket数据传输限制:
WebSocket链接建立之后,一次发送或接收的数据包(message)最大体积为6 MB。
HTTP触发器的入口函数形式
HTTP协议
- Node.js
- Python
WebSocket协议
只有Custom Runtime和Custom Container支持WebSocket协议,请参见配置HTTP触发器并使用WebSocket触发、Custom Runtime环境说明和Custom Container简介。