使用 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 函数
2.1 开通百度云 CFC 服务
若您还未开通百度云 TableStorage 服务,则可以通过【百度云控制台】>【计算】>【函数计算】开通相关服务。
2.2 创建函数
由于暂时 TableStorage 服务仅支持广州、保定地区。故需要您手动选择 CFC 广州地区,并以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 设计如下
# 获取对应学生成绩单
GET /students?instance={instance_name}&table={table_name}&name={name}
# 上传/修改学生成绩单
POST/PUT /students
{
"instance":"instance_name",
"table": "table_name",
"cells": {
"chinese":"100",
"math":"100",
"english":"100",
"physics":"100",
"chemistry":"100",
"biology":"100"
}
# 删除学生信息
DELETE /students?instance={instance_name}&table={table_name}&name={name}
则对应方法如下所示:
@app.route('/students',method='GET')
def get_row():
"""
@param: request: bottle request
@return: http return
本方法用于从 TableStorage 中获取数据
"""
instance = bytes(request.query.name, encoding='utf8')
table = bytes(request.query.name, encoding='utf8')
name = bytes(request.query.name, encoding='utf8')
bts = init_bts_client()
query_row_arg = QueryRowArgs()
query_row_arg.rowkey = name
try:
res = bts.get_row(instance, table, query_row_arg)
if res is None:
return HTTPResponse(body={'error': 'resource not found'}, status=404)
else:
return HTTPResponse(body={'body':str(res.result[0])},status_code=200)
except Exception as exception:
return HTTPResponse(body={'error':exception}, status=400)
@app.route('/students', method=['POST', 'PUT'])
def put_row():
"""
@param: bottle request
@return: http response
本方法用于将输入数据存储于 TableStorage 中
"""
bts = init_bts_client()
body = request.json
instance = bytes(body['instance'],encoding='utf8')
table = bytes(body['table'],encoding='utf8')
name = bytes(body['name'],encoding='utf8')
c = body['cells']
cells = []
for key, value in c.items():
cells.append(Cell(key, value).__dict__)
row = Row()
row.rowkey = name
row.cells = cells
try:
res = bts.put_row(instance, table, row)
return HTTPResponse(status_code=200)
except Exception as exception:
return HTTPResponse(status_code=400, body={'error': exception})
@app.route('/students', method='DELETE')
def delete_row():
"""
@param: bottle request
@return: http response
本方法用于从百度云TableStroage中删除对应数据
"""
bts = init_bts_client()
instance = bytes(request.query.instance, encoding="utf8")
table = bytes(request.query.table, encoding="utf8")
name = bytes(request.query.name, encoding="utf8")
query_row_args = QueryRowArgs()
query_row_args.rowkey = name
try:
bts.delete_row(instance, table, query_row_args)
return HTTPResponse(status_code=204)
except Exception as e:
return HTTPResponse(status_code=400, body={'error': e})
同时,在函数界面创建 HTTP 触发器,路径为/students,方法为 GET、POST、PUT、DELETE
4.3 实践
创建完毕触发器,部署完毕方法后,可以简单测试对应 API。
原始数据如下所示:
- 上传成绩: 使用cURL请求上传成绩,如下所示:
curl --location --request POST 'https://dn99xpwe8yjgx.cfc-execute.gz.baidubce.com/students' \
--header 'Content-Type: application/json' \
--data-raw '{
"instance": "test_cfc",
"table": "test_cfc",
"name": "xiaoming",
"cells": {
"chemistry": "100",
"chinese": "100",
"math": "100",
"english": "100",
"physics": "100",
"biology": "100"
}
}'
执行完毕后, TableStorage 表格数据如下所示,如图所示,数据已经被写入表格中。
- 查询成绩: 使用cURL查询成绩,如下所示:
curl --location --request GET 'https://dn99xpwe8yjgx.cfc-execute.gz.baidubce.com/students?instance=test_cfc&table=test_cfc&name=xiaoming' \
--header 'Content-Type: application/json'
resonse如下所示:
{"body": "{rowkey:u'xiaoming',cells:[{column:u'biology',value:u'100',timestamp:1584633381567}, {column:u'chemistry',value:u'100',timestamp:1584633381567}, {column:u'chinese',value:u'100',timestamp:1584633381567}, {column:u'english',value:u'100',timestamp:1584633381567}, {column:u'math',value:u'100',timestamp:1584633381567}, {column:u'physics',value:u'100',timestamp:1584633381567}]}"}
- 删除成绩: 使用cURL删除某一学生成绩,如下所示:
curl --location --request DELETE 'https://dn99xpwe8yjgx.cfc-execute.gz.baidubce.com/students?instance=test_cfc&table=test_cfc&name=xiaoming' \
--header 'Content-Type: application/json'
执行完毕后,相关数据在 TableStorage 中已经被删除。如图所示:
总结
使用 CFC HTTP 触发器以及 TableStorage 数据库,可以轻松地将 API 托管至云端实现插件化的 API,一方面可以节省计算机资源,另一方面则可以为系统升级、迁移等操作提供便利。