使用 CFC HTTP 触发器托管 API
概述
在我们进行Web API的相关开发过程中,偶尔需要对系统进行 API 的增加或者迁移,在系统逻辑较为复杂的情况下,进行 API 的扩充或者迁移往往工作量较大。此时,使用 CFC 以及百度云 TableStorage 则可以简单地实现 API 的托管,从而减少系统的负载,同时增加接口的可移植性。
适用场景
- Web API托管
- 插件式 API
方案优势
- 托管 API 至CFC,可节约资源
- 增加 API的可移植性
- 减少 API 之间的耦合度
方案流程
一、创建 Table
1.1 开通百度云 TableStorage 服务
若您还未开通百度云 TableStorage 服务,则可以通过【百度云控制台】>【数据库】>【TableStorage】开通相关服务。
1.2 创建实例
开通 TableStorage 服务后,您可以由控制台进入 TableStorage 中,并且创建对应的实例。如图所示。更多实例相关操作详情可参考TableStorage实例操作

1.3 创建表
创建 TableStorage 实例后,您可以进入对应实例创建对应表。详细如下图所示。详细的创建操作可参考TableStorage表操作

至此,TableStorage 已经准备就绪。
二、创建 CFC 函数
导航路径:百度智能云控制台->计算->函数计算 CFC
2.1 开通 CFC 服务
若尚未开通 CFC 服务,请先进入 【函数计算】 服务页完成开通。
2.2 创建函数
选择与 TableStorage 一致且受支持的地域,按 CFC_TableStorag_API 蓝图创建函数。
2.3 部署相关代码
根据蓝图中的代码提示,补全实例名称、表名称以及字段名称等信息,并按 API 需求调整返回格式。
三、创建 HTTP 触发器进行 API 托管
3.1 创建 HTTP 触发器
在对应函数中创建 HTTP 触发器,并根据自己需要填写路径以及 HTTP 方法。具体创建流程可参考HTTP触发器开发参考
3.2 配置函数路径
根据蓝图代码注释配置相关的函数route信息。
四、简单实践
4.1 场景
若需要托管一个成绩查询 API 于 CFC 函数,其中学生成绩表格如下所示:
| 姓名 | 语文 | 数学 | 英语 | 物理 | 化学 | 生物 |
|---|---|---|---|---|---|---|
| 小明 | 123 | 123 | 123 | 123 | 123 | 123 |
则对应的 TableStorage 表格如下所示:

4.2 API 设计
API 设计如下:
1# 获取对应学生成绩单
2GET /students?instance={instance_name}&table={table_name}&name={name}
3
4# 上传/修改学生成绩单
5POST/PUT /students
6{
7 "instance": "<实例名称>",
8 "table": "<数据表名称>",
9 "name": "<学生姓名>",
10 "cells": {
11 "chinese": "<语文成绩>",
12 "math": "<数学成绩>",
13 "english": "<英语成绩>",
14 "physics": "<物理成绩>",
15 "chemistry": "<化学成绩>",
16 "biology": "<生物成绩>"
17 }
18}
19
20# 删除学生信息
21DELETE /students?instance={instance_name}&table={table_name}&name={name}
切换到 【函数代码】 页,按蓝图代码注释配置函数路由,使函数路径与 HTTP 触发器路径保持一致。示例路由如下:
1@app.route('/students', method='GET')
2def get_row():
3 """
4 @param: request: bottle request
5 @return: http return
6
7 本方法用于从 TableStorage 中获取数据
8 """
9 instance = bytes(request.query.instance, encoding='utf8')
10 table = bytes(request.query.table, encoding='utf8')
11 name = bytes(request.query.name, encoding='utf8')
12
13 bts = init_bts_client()
14 query_row_arg = QueryRowArgs()
15 query_row_arg.rowkey = name
16 try:
17 res = bts.get_row(instance, table, query_row_arg)
18 if res is None:
19 return HTTPResponse(body={'error': 'resource not found'}, status_code=404)
20 return HTTPResponse(body={'body': str(res.result[0])}, status_code=200)
21 except Exception as exception:
22 return HTTPResponse(body={'error': str(exception)}, status_code=400)
23
24
25@app.route('/students', method=['POST', 'PUT'])
26def put_row():
27 """
28 @param: bottle request
29 @return: http response
30
31 本方法用于将输入数据存储于 TableStorage 中
32 """
33 bts = init_bts_client()
34 body = request.json
35 instance = bytes(body['instance'], encoding='utf8')
36 table = bytes(body['table'], encoding='utf8')
37 name = bytes(body['name'], encoding='utf8')
38 cells_data = body['cells']
39 cells = []
40 for key, value in cells_data.items():
41 cells.append(Cell(key, value).__dict__)
42
43 row = Row()
44 row.rowkey = name
45 row.cells = cells
46 try:
47 bts.put_row(instance, table, row)
48 return HTTPResponse(status_code=200)
49 except Exception as exception:
50 return HTTPResponse(status_code=400, body={'error': str(exception)})
51
52
53@app.route('/students', method='DELETE')
54def delete_row():
55 """
56 @param: bottle request
57 @return: http response
58
59 本方法用于从百度云 TableStorage 中删除对应数据
60 """
61 bts = init_bts_client()
62 instance = bytes(request.query.instance, encoding='utf8')
63 table = bytes(request.query.table, encoding='utf8')
64 name = bytes(request.query.name, encoding='utf8')
65 query_row_args = QueryRowArgs()
66 query_row_args.rowkey = name
67
68 try:
69 bts.delete_row(instance, table, query_row_args)
70 return HTTPResponse(status_code=204)
71 except Exception as exception:
72 return HTTPResponse(status_code=400, body={'error': str(exception)})
同时,在函数界面创建 HTTP 触发器,路径为/students,方法为 GET、POST、PUT、DELETE
4.3 实践
完成函数部署与触发器配置后,可使用触发器访问地址进行验证。
上传成绩:
1curl --location --request POST 'https://<HTTP 触发器域名>/students' \
2--header 'Content-Type: application/json' \
3--data-raw '{
4 "instance": "<实例名称>",
5 "table": "<数据表名称>",
6 "name": "<学生姓名>",
7 "cells": {
8 "chemistry": "<化学成绩>",
9 "chinese": "<语文成绩>",
10 "math": "<数学成绩>",
11 "english": "<英语成绩>",
12 "physics": "<物理成绩>",
13 "biology": "<生物成绩>"
14 }
15}'
查询成绩:
1curl --location --request GET 'https://<HTTP 触发器域名>/students?instance=<实例名称>&table=<数据表名称>&name=<学生姓名>' \
2--header 'Content-Type: application/json'
返回结果为对应学生的成绩记录,具体字段内容取决于 TableStorage 中已写入的行数据。
删除成绩:
1curl --location --request DELETE 'https://<HTTP 触发器域名>/students?instance=<实例名称>&table=<数据表名称>&name=<学生姓名>' \
2--header 'Content-Type: application/json'
执行删除后,对应学生成绩记录会从 TableStorage 中移除。
总结
使用 CFC HTTP 触发器以及 TableStorage 数据库,可以轻松地将 API 托管至云端实现插件化的 API,一方面可以节省计算机资源,另一方面则可以为系统升级、迁移等操作提供便利。
评价此篇文章
