HTTP触发器通过发送HTTP请求触发函数执行,主要适用于快速构建Web服务等场景。本文介绍HTTP触发器的注意事项、优势、调用方式、协议支持、CORS请求处理、使用限制以及入口函数形式。

注意事项

  • 如果您的HTTP触发器为匿名触发器,即触发器配置中参数是否需要认证选择为,则无需验证身份,任何人都可以发送HTTP请求调用您的函数,存在URL泄露的风险。此时,您可以设置检查请求消息头部字段Authorization是否合法来进行鉴权验证,避免URL泄露。更多信息,请参见签名认证

    根据国家网络安全监管要求,阿里云安全团队会对备案在阿里云上的网络域名进行随机抽检访问,这种情况下,您的匿名HTTP网络域名可能会被请求,产生额外调用记录。

  • 非Web Server模式的Custom Container函数不支持创建HTTP触发器。

在配置和使用HTTP触发器前,您需要了解HTTP触发器和HTTP、WebSocket以及gRPC协议的使用限制。具体信息,请参见使用限制

优势

HTTP触发器与API网关触发器均可应用于Web应用的创建。相较于API网关触发器,HTTP触发器有以下优势。

  • 降低开发人员的学习成本和简化开发人员的调试过程,帮助开发人员快速使用函数计算搭建Web应用和API。
  • 减少请求处理环节,HTTP触发器支持更高效的请求、响应格式,不需要编码或解码成JSON格式,性能更优。
  • 支持选择熟悉的HTTP测试工具验证函数计算侧的功能和性能。
  • 方便对接其他支持Webhook回调的服务,例如CDN回源、MNS等。
  • 支持WebSocket协议。
  • 支持gRPC协议。

调用方式

调用函数的方式包括同步调用和异步调用。同步调用指事件被函数处理后直接返回结果。异步调用指函数计算收到请求后,将请求持久化保存,然后立即返回响应,而不是等待请求执行完成后,再返回执行结果。

同步调用

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"

说明 如果函数计算返回的状态码是202以外的状态码,则表示调用失败。关于调用失败后错误原因,请参见错误处理
相关文档:
  • 关于异步调用的更多信息,请参见异步调用
  • 关于异步任务的更多信息,请参见功能概览

协议支持

CORS请求处理

函数计算系统默认允许HTTP函数的调用请求跨域访问,同时也支持用户在函数代码中自定义函数对跨域(即CORS)请求的处理行为。

简单请求

简单请求不会发送预检请求,您可以直接在函数代码中设置Access-Control-Allow-* 开头的Header,完成简单的访问控制。对于简单请求,函数计算支持自定义的Headers包括:
  • Access-Control-Allow-Origin
  • Access-Control-Allow-Headers
  • Access-Control-Request-Method
  • Access-Control-Max-Age

如果您没有自定义Headers,函数计算的Response Headers会默认设置为Request请求中相应的字段:

  • Access-Control-Allow-Origin:Request请求的Origin Header
  • Access-Control-Allow-Credentials: true
  • Access-Control-Expose-Headers函数计算自定义的一些Headers

非简单请求

非简单请求在发送正式请求前会发送预检请求,即一次非简单请求包含一次OPTIONS方法的函数调用请求和一次实际的函数调用请求。正式请求的规则与上文的简单请求相同。如果您需要自定义预检请求的返回,则需要:

  1. 为HTTP触发器添加OPTIONS方法。
  2. 在函数代码中处理OPTIONS请求,即设置Access-Control-Allow-*开头的Header以控制函数的跨域行为。

对于预检请求,函数计算支持用户自定义的Headers包括:

  • Access-Control-Allow-Origin
  • Access-Control-Allow-Headers
  • Access-Control-Request-Method
  • Access-Control-Max-Age
以Node.js为例,函数代码中处理预检请求的示例如下所示:
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触发器。
  • 针对一个版本或一个别名,最多只能创建一个HTTP类型的触发器。详细信息,请参见管理版本管理别名

HTTP协议使用限制

  • HTTP Request限制
    • Request Headers不支持以x-fc-开头的自定义字段和以下自定义字段:
      • connection
      • keep-alive
    • 如果Request超过以下限制,会返回400状态码和InvalidArgument错误码。
      • Headers大小:Headers中的所有Key和Value的总大小不得超过4 KB。
      • Path大小:包括所有的Query Params,Path的总大小不得超过4 KB。
      • Body大小:同步调用请求的Body的总大小不得超过16 MB,异步调用请求的Body的总大小不得超过128 KB。
  • HTTP Response限制
    • Response Headers不支持以x-fc-开头的自定义字段和以下自定义字段:
      • connection
      • content-length
      • date
      • keep-alive
      • server
      • upgrade
      • content-disposition:attachment
        说明 从安全角度考虑,使用函数计算默认的aliyuncs.com域名,服务端会在Response Headers中强制添加content-disposition: attachment字段,此字段会使得返回结果在浏览器中以附件的方式下载。如果要移除该限制,需设置自定义域名。详细信息,请参见配置自定义域名
    • 如果Response超过以下限制,会返回502状态码和BadResponse错误码。
      • Headers大小:Headers中的所有Key和Value的总大小不得超过4 KB。
  • 其他使用说明

    您可以通过绑定自定义域名,为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。

gRPC协议使用限制

  • Runtime支持:仅Custom Runtime和Custom Container支持gRPC协议。
  • 使用方式:
    • 使用gRPC触发函数执行前,请确保HTTP触发器的请求方法中包含POST。
    • 请使用子域名fcapp.run或者自定义域名发起gRPC调用。
  • 超时时间限制:gRPC请求受函数配置的超时时间限制,即流式gRPC的链接最长保持时间不得超过函数配置的执行超时时间
  • gRPC数据传输限制:gRPC流式链接建立之后,一次发送或接收的数据包(message)最大体积为6 MB。

HTTP触发器的入口函数形式

HTTP协议

设置HTTP触发器的函数和普通函数的入口函数是有差异的,左边的普通函数与右边设置了HTTP触发器函数的对比示例,如下图所示。如果您设置HTTP触发器后仍然使用普通接口,请及时修改。
  • Node.jscode_compare_js
  • Pythoncode_compare_py

WebSocket协议

仅Custom Runtime和Custom Container支持WebSocket协议。更多信息,请参见配置HTTP触发器并使用WebSocket触发Custom Runtime环境说明Custom Container简介

gRPC协议

只有Custom Runtime和Custom Container支持gRPC协议。更多信息,请参见配置HTTP触发器并使用gRPC触发