
# 创建HTTP函数
如需使用流行Web应用框架编写函数代码和构建AI项目，可创建HTTP函数，并根据业务需求完成函数代码、网络配置及函数触发器等必要配置。本章节介绍如何通过控制台创建HTTP函数并提供HTTP使用示例。
FunctionGraph支持创建空白事件函数和HTTP函数，关于事件函数与HTTP函数的选型对比请参考[表1]。
 表1事件函数与HTTP函数选型对比 
| 对比项  | 事件函数                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | HTTP函数                                                                                                                                                                                                                                                                                                                                                                                                                         |
|:---|:---|:---|
| 功能   | 用于处理文件和数据流，可以通过[各类云产品的事件触发](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0399.html)，以及用于处理异步请求，能够追踪并保存每个异步调用的状态。                                                                                                                                                                                                                                                                                                                                           | 支持流行的Web应用框架和AI项目，可以通过浏览器访问，或通过URL调用。                                                                                                                                                                                                                                                                                                                                                                                          |
| 适用场景 | - 云产品集成： OBS实时文件处理、LTS日志加工等。  - ETL数据加工：数据库数据清洗、消息队列处理等。  - 常规任务：定时任务、周期任务、脚本任务等。  - 多媒体处理：音视频转码、直播录制、图片加工等。   | - 快速构建流行Web框架应用：Express、Flask等。  - 快速构建AI模型推理服务：如Stable Diffusion、ComfyUI、DeepSeek等。  - 迁移已有的应用和接口：HTML5网站、REST API接口、移动APP、小程序、游戏结算等。   |
   
#### HTTP函数概述
HTTP函数专注于优化 Web 服务场景，用户可以直接发送HTTP请求到URL触发函数执行，从而使用自己的Web服务。HTTP函数支持HTTP/1.1协议。
HTTP函数有以下优势：
- 丰富的框架支持 您可以使用常见的Web框架（例如 Nodejs Web 框架：Express、Koa）编写HTTP函数，也可以将您本地的Web框架服务以极小的改造量快速迁移上云。
  
- 减少请求处理环节 函数可以直接接收并处理HTTP请求，API 网关不再需要做JSON格式转换，减少请求处理环节，提升Web服务性能。
  
- 编写体验舒适化 HTTP 函数的编写体验更贴近编写原生Web服务，可以使用Node.js原生接口，保证和本地开发服务体验一致。
  
 
#### HTTP函数公共请求头
HTTP请求头是HTTP协议中用于传递元数据的重要组成部分，在函数调用时可以传递特定的元数据或配置信息，函数默认携带的公共请求头字段如[表2]所示。
HTTP函数的密钥信息仅能通过请求头传递，如需获取HTTP函数的AK、SK、Token，请参考[配置HTTP函数的请求头传入密钥](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0395.html)。
 表2默认请求头 
| 字段                 | 描述            |
|:---|:---|
| X-CFF-Request-Id   | 当前的请求ID。      |
| X-CFF-Memory       | 函数分配的内存。      |
| X-CFF-Timeout      | 函数超时时间。       |
| X-CFF-Func-Version | 函数版本。         |
| X-CFF-Func-Name    | 函数名称。         |
| X-CFF-Project-Id   | 函数的ProjectID。 |
| X-CFF-Package      | 函数组。          |
| X-CFF-Region       | 函数当前所在Region。 |
   
#### 约束与限制
表3创建HTTP函数约束限制 
| 限制类别     | 具体限制                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
|:---|:---|
| 创建函数数量限制 | 单个账户下最大允许创建的函数个数默认为400个，如需扩大配额请[提交工单](https://console.huaweicloud.com/ticket/?agencyId=e4ebeeb18baa4ae58946b5342fa6159d#/ticketindex/createIndex)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| HTTP函数限制 | - HTTP函数当前不区分编程语言，函数执行入口必须在bootstrap文件中设置，用户直接写启动命令，**端口统一开放成8000**，绑定IP为127.0.0.1。  - 函数需要返回一个合法的HTTP响应报文，用户的HTTP响应体不超过6M。 **函数的返回合法的HTTP响应报文中必须包含body(String)、statusCode(int)、headers(Map)和isBase64Encoded(boolean)，HTTP函数会默认对返回结果做Base64编码，isBase64Encoded默认为true，其它框架同理。**   - HTTP函数只允许创建APIG和APIC触发器，其他触发器类型不支持。触发器使用方法请参考[使用APIG专享版触发器](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0204.html#functiongraph_01_0204__section658012319217)。  - HTTP函数不支持长时间运行和异步调用，不支持重试。   |
| 其他限制     | - bootstrap文件是HTTP函数的启动文件，HTTP函数仅支持读取bootstrap作为启动文件名称，其它名称将无法正常启动服务，bootstrap启动文件请参见[bootstrap文件示例]。 若运行JAR包，bootstrap中建议增加JVM参数-Dfile.encoding=utf-8，否则可能会出现中文乱码。   - 函数发起HTTP请求时，如果是内网访问，则请求IP地址是动态；如果是公网访问，则请求IP地址是固定。如需了解更多关于请求IP地址的详情，请[提交工单](https://console.huaweicloud.com/ticket/?agencyId=e4ebeeb18baa4ae58946b5342fa6159d#/ticketindex/createIndex)咨询技术支持工程师。                                                                                                                                                                                                                                                                                                                               |
   
#### 前提条件
- 使用函数工作流控制台的所有操作均默认具有操作权限，请确保您登录的用户已有"FunctionGraph Administrator"权限，即FunctionGraph服务所有权限，更多权限的说明请参考[权限管理](https://support.huaweicloud.com/productdesc-functiongraph/functiongraph_01_0160.html)。
- 如果函数工作流服务需要访问云日志服务LTS、虚拟私有云VPC等其他云服务进行协同工作，则需[创建函数委托](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0920.html#functiongraph_01_0920__section17872123319473)并授权函数工作流服务访问所需云服务的权限；若函数工作流服务无需访问其他云服务，则无需创建和选择函数委托。
- 如果需要配置函数工作流服务访问VPC内资源，请参考[创建虚拟私有云和子网](https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0013935842.html)创建VPC和子网。
 
 #### 创建HTTP函数
1. 登录[函数工作流控制台](https://console.huaweicloud.com/functiongraph/?locale=zh-cn)，在左侧的导航栏选择"函数 \> 函数列表"。
2. 单击右上方的"创建函数"，进入"创建函数"页面。
3. 如[图1]所示，创建方式选择"创建空白函数"，参考[表4]配置函数基本信息，参考[表5]配置函数高级设置参数。
   
   图1创建HTTP函数基本信息   
   ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002269168466.png "点击放大")
   
    表4函数基本信息 
   | 参数     | 说明                                                                                                                                                                                                                                                                                                                                                                     | 取值样例                                                                  |
   |:---|:---|:---|
   | 函数类型   | 选择HTTP函数。 处理HTTP请求的函数，可以直接发送HTTP请求到URL触发函数执行，从而使用Web服务。                                                                                                                                                                                                                                                                           | HTTP函数                                                                |
   | 区域     | 选择函数所在的区域。 不同区域的资源之间内网不互通，请就近选择靠近您业务的区域，可以降低网络时延、提高访问速度。                                                                                                                                                                                                                                                                       | 华东-上海一                                                                |
   | 函数名称   | 输入自定义的函数名称，命名规则如下： - 可包含字母、数字、下划线和中划线，长度不超过60个字符。  - 以大/小写字母开头，以字母或数字结尾。                                       | FG-demo                                                               |
   | 企业项目   | 选择函数所属的企业项目。企业项目是一种云资源管理方式，企业项目管理服务提供统一的云资源按项目管理，以及项目内的资源管理、成员管理。 默认为"default"，支持用户选择已创建的企业项目。 **如果您没有开通企业管理服务，将无法看到企业项目选项。开通方法请参见[如何开通企业项目](https://support.huaweicloud.com/usermanual-em/eps_15_0001.html)。**                                                                      | default                                                               |
   | 委托     | 选择函数的委托。通过委托来授权函数工作流来访问其他云服务，若函数不访问任何云服务，则无需选择委托。 默认"未使用任何委托"，支持选择已创建的委托。 当华为云账号下无函数默认委托时，FunctionGraph提供快速创建默认委托"fgs_default_agency"的功能，详情请参见[默认委托](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0920.html#functiongraph_01_0920__section102217211358)。 | fgs_default_agency                                                    |
   | 委托权限策略 | **此参数仅在选择使用委托时显示。** 选定委托后将展示该委托关联的权限策略，如需调整权限策略，请参考[修改函数委托](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0920.html#functiongraph_01_0920__section17979205025313)通过IAM控制台进行操作。                                                                                                                     | DIS User; SWR Admin; fgs_default_region_role; fgs_default_global_role |
      
   图2创建函数高级设置参数说明   
   ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002510011145.png "点击放大")
   
   
    表5创建函数高级设置参数说明 
   | 参数         | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | 取值样例                      |
   |:---|:---|:---|
   | 函数访问公网     | 开启时，函数可以通过默认网卡访问公网上的服务，其公网访问带宽为用户间共享，仅适用于测试场景。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | 开启                        |
   | 函数访问VPC内资源 | **开启此参数需要函数配置包含VPC管理权限的委托，若基本信息的委托中选择"未使用任何委托"则无法开启。** 开启时，函数将使用配置的VPC所绑定的网卡进行网络访问，同时禁用函数工作流的默认网卡，即开关"函数访问公网"参数将不生效。 开启后可选择函数需访问的VPC及其子网。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | 未开启                       |
   | 日志记录       | 启用日志功能后，函数运行过程中产生的日志会上报到云日志服务（LTS）。 注意： LTS将按需收取日志管理费用，详情请参见[云日志服务价格详情](https://www.huaweicloud.com/pricing/calculator.html#/lts)。 开启后可配置以下参数： - 日志配置方式 - 自动配置：使用默认日志组和日志流。  - 自定义配置：选择自定义创建的[日志组](https://support.huaweicloud.com/usermanual-lts/lts_04_0003.html)和[日志流](https://support.huaweicloud.com/usermanual-lts/lts_04_0004.html)。    - 日志标签 函数执行时，会将日志标签配置上报到LTS，可通过标签在LTS控制台对函数日志进行过滤筛选，日志标签详情请参见[日志管理](https://support.huaweicloud.com/usermanual-lts/lts_04_0003.html#lts_04_0003__table9217134717322)。 标签键/标签值只能包含数字、字母、下划线和中划线，标签最大长度为64。最多支持添加10个标签。    | 未开启                       |
   | 标签         | 为函数添加标签，标签用于标识和分类函数资源。 添加标签后，可在"函数列表"页面通过标签快速检索和定位函数，便于系统化管理资源。 标签与函数资源间为多对多关系，最多支持为单个函数添加20个标签。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | -                         |
   | KMS静态加密代码  | 当前仅"拉美-圣保罗一"区域支持配置该参数。 选择是否使用KMS静态加密函数代码。 注意： 密码安全中心DEW将按需收取费用，详情请参见[密码安全中心计费说明](https://support.huaweicloud.com/price-dew/dew_03_0006.html)。 支持选择以下加密类型： - （默认）functiongraph/default：函数会在您账号下的DEW服务中自动创建默认密钥，您无需手动创建。 首次使用该默认密钥进行加解密，需确保函数委托中拥有以下权限：kms:dek:decrypt、 kms:dek:create、 kms:cmk:create、kms:cmk:get、 kms:cmk:list。   - 使用用户主密钥：支持选择已创建的密钥加密函数代码，创建用户主密钥可参考[创建自定义密钥](https://support.huaweicloud.com/usermanual-dew/dew_01_0178.html)。使用用户主密钥，需确保函数委托中拥有以下权限：kms:dek:decrypt、 kms:dek:create、 kms:cmk:get、 kms:cmk:list。 注意： 若选择"使用用户主密钥"，在后续使用中请勿在DEW服务中删除用于函数加密的主密钥，否则将因加密数据无法解密而导致函数执行失败。    请参考[JSON视图配置自定义策略](https://support.huaweicloud.com/usermanual-iam/iam_01_0605.html#section1)前往IAM控制台配置函数的委托权限策略。                 | （默认）functiongraph/default |
      
   
   
4. 配置完成后单击"创建函数"，页面跳转至函数详情配置页面，界面上方显示成功创建函数。
5. 完成函数创建后，请参见[配置函数](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0300.html)，根据业务需求完成各项配置，即可使用函数。
 
#### HTTP函数使用示例
以下以一个完整的HTTP函数创建和配置示例介绍HTTP函数的使用方法。
**在调用API前，请先确保您的业务系统所在网络与API的访问域名或地址互通：**
- 若业务系统与HTTP函数在相同VPC内时，可直接访问API。
- 若业务系统与HTTP函数在同一区域的不同VPC内时，可通过创建VPC对等连接，将两个VPC的网络打通，实现同一区域跨VPC访问API。具体步骤请参考[VPC对等连接说明](https://support.huaweicloud.com/usermanual-vpc/vpc_peering_0000.html)。
- 若业务系统与HTTP函数在不同区域的不同VPC内时，可通过创建云连接实例并加载需要互通的VPC，将两个VPC的网络打通，实现跨区域跨VPC访问API。具体步骤请参考[跨区域VPC互通](https://support.huaweicloud.com/qs-cc/cc_02_0201.html)。
- 若业务系统与HTTP函数通过公网互通，请确保HTTP函数已绑定弹性IP。
 
#### 步骤一：制作代码包
1. 准备一个node脚本文件，命名为"index.js"，代码示例如下：
   ```
   const http = require('http'); // Import Node.js core module
    
   var server = http.createServer(function (req, res) {   //create web server
       res.writeHead(200, { 'Content-Type': 'text/html' });
       res.write('<html><body><h2>This is http function.</h2></body></html>');
       res.end();
   });
    
   server.listen(8000, '127.0.0.1'); //6 - listen for any incoming requests
    
   console.log('Node.js web server at port 8000 is running..')
   ```
   如需解析事件中的body，可参考以下代码示例：
   ```
   const http = require('http');
   const server = http.createServer((req, res) => {
       // 只处理 POST 请求（也可以处理 PUT/PATCH/DELETE 等有请求体的方法）
       if (req.url.startsWith("/apig-event-template")) {
           let body = '';
           // 1. 监听 'data' 事件收集数据块
           req.on('data', (chunk) => {
               body += chunk; // 将二进制数据块转为字符串
               // 可选：设置请求体大小限制（防止内存溢出）
               if (body.length > 1e6) { // 1MB
                   req.destroy(); // 终止连接
               }
           });
           // 2. 监听 'end' 事件处理完整请求体
           req.on('end', () => {
               try {
                   // 根据 Content-Type 处理不同格式
                   const contentType = req.headers['content-type'] || '';
                   // 处理 JSON 格式
                   if (contentType.includes('application/json')) {
                       const data = JSON.parse(body);
                       console.log('Received JSON:', data);
                       // 处理表单格式 (URL编码)
                   } else if (contentType.includes('application/x-www-form-urlencoded')) {
                       const params = new URLSearchParams(body);
                       const data = Object.fromEntries(params);
                       console.log('Received form data:', data);
                       // 处理普通文本
                   } else {
                       console.log('Received raw text:', body);
                   }
                   // 响应客户端
                   res.writeHead(200, { 'Content-Type': 'text/plain' });
                   res.end('Body received');
               } catch (error) {
                   // 处理错误（如 JSON 解析失败）
                   console.error('Error processing body:', error);
                   res.writeHead(400, { 'Content-Type': 'text/plain' });
                   res.end('Invalid body format');
               }
           });
           // 3. 处理请求错误
           req.on('error', (error) => {
               console.error('Request error:', error);
               res.writeHead(500, { 'Content-Type': 'text/plain' });
               res.end('Internal server error');
           });
       } else {
           // 处理无请求体的方法
           res.writeHead(200, { 'Content-Type': 'text/plain' });
           res.end('No body needed');
       }
   });
   // 启动服务器
   const PORT = 8000;
   server.listen(PORT, () => {
       console.log(`Server running at http://localhost:${PORT}`);
   });
   ```
   
2. 准备一个bootstrap启动文件，作为HTTP函数的启动文件。
   示例：bootstrap文件内容如下。
   ```
   /opt/function/runtime/nodejs12.13/rtsp/nodejs/bin/node $RUNTIME_CODE_ROOT/index.js
   ```
   
3. 将上述两个文件打包为zip文件。
   图3文件打成zip包   
   ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002269685248.png "点击放大")
   **如果执行HTTP类型是Python函数，则bootstrap文件中执行函数时，建议增加"-u"参数确保日志落盘。**例如：
   ```
   /opt/function/runtime/python3.6/rtsp/python/bin/python3 -u $RUNTIME_CODE_ROOT/index.py
   ```
   如需使用其他语言，则参考[表6]更换语言路径，请注意根据使用的运行时语言版本更换路径信息，代码包路径无需更换。
    表6多语言路径说明示例 
   | 语言                 | 路径                                                       |
   |:---|:---|
   | Java21             | /opt/function/runtime/java21/rtsp/jre/bin/java           |
   | Python3.12         | /opt/function/runtime/python3.12/rtsp/python/bin/python3 |
   | PHP8.3             | /opt/function/runtime/php8.3/rtsp/php/bin/php            |
   | C# (.NET Core 8.0) | /opt/function/runtime/dotnet8.0/rtsp/dotnet/dotnet       |
      
   
 
#### 步骤二：部署代码包
1. 参考[创建HTTP函数]创建一个HTTP函数。
2. 在HTTP函数的代码详情页中，单击"上传代码 \> Zip文件"上传[步骤一：制作代码包]准备好的Zip包。
3. 创建触发器。
   1. 选择"设置 \> 触发器"页签，单击"创建触发器"。
   
   2. 如[图4]所示配置触发器信息，此处以创建"API网关服务（APIG专享版）"触发器为例，参数详情请参见[使用API网关服务（APIG专享版）触发器](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0204.html)。
      图4创建触发器   
      ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002304438185.png "点击放大")
      
      **示例中"安全认证"选择"None"，生产环境强烈建议开启APP认证或IAM认证。**
      
   
   3. 配置完成后，单击"确定"，完成APIG触发器创建。
    
4. 发布API。
   1. 单击"触发器"页签下的API名称，跳转至API的总览页面。
      图5API触发器   
      ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002304365077.png "点击放大")
      
      
   
   2. 单击右上方的"编辑"，进入"基本信息"页面。
      图6编辑API   
      ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002304438189.png "点击放大")
      
      
   
   3. 修改"路径"参数为"/user/get"并单击"完成"。
      图7定义API请求   
      ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002304365081.png "点击放大")
      
      
   
   4. 回到API详情界面，单击右上角的"发布最新版本"，在"发布API"页面单击"确定"完成API发布。
    
 
#### 步骤三：触发函数执行
1. 返回函数工作流控制台，在左侧导航栏选择"函数 \> 函数列表"，单击创建的HTTP函数进入函数详情页。
2. 选择"设置 \> 触发器"，如[图8]所示复制"调用URL"，在浏览器访问。
   图8复制URL   
   ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002254215948.png "点击放大")
   
   
3. 查看请求结果。
   图9查看请求结果   
   ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002203044301.png "点击放大") 
 
#### 相关文档
- 使用Go语言构建FunctionGraph HTTP函数的实践，详情请参见[使用Go构建FunctionGraph HTTP函数](https://support.huaweicloud.com/bestpractice-functiongraph/functiongraph_05_1168.html)。
- 使用已有SpringBoot项目构建HTTP函数的实践，请参见[使用已有SpringBoot项目构建HTTP函数](https://support.huaweicloud.com/bestpractice-functiongraph/functiongraph_05_1035.html)。
- 针对不同使用场景，函数工作流支持通过在线编写代码、上传代码文件或者使用容器镜像，创建事件函数和HTTP函数，且支持使用GPU计算资源。如何针对应用场景进行函数类型选型，详情请参见[函数类型选型](https://support.huaweicloud.com/productdesc-functiongraph/functiongraph_02_1001.html)。
- 除使用控制台外，函数工作流支持通过API的方式创建函数，详情请参见[创建函数](https://support.huaweicloud.com/api-functiongraph/functiongraph_06_0108.html)。
- 创建函数的常见问题排查方法请参见[创建函数常见问题](https://support.huaweicloud.com/functiongraph_faq/functiongraph_03_0344.html)。
 
