所有文档

          函数计算 CFC

          使用 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实例操作

          image.png

          1.3 创建表

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

          image.png

          至此,TableStorage 已经准备就绪。

          二、创建 CFC 函数

          2.1 开通百度云 CFC 服务

          若您还未开通百度云 TableStorage 服务,则可以通过【百度云控制台】>【计算】>【函数计算】开通相关服务。

          2.2 创建函数

          由于暂时 TableStorage 服务仅支持广州、保定地区。故需要您手动选择 CFC 广州地区,并以CFC_TableStorag_API为蓝图创建函数。如下所示:

          image.png

          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 表格如下所示:

          image.png

          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。

          原始数据如下所示:

          image.png

          • 上传成绩: 使用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 表格数据如下所示,如图所示,数据已经被写入表格中。

          image.png

          • 查询成绩: 使用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 中已经被删除。如图所示:

          image.png

          总结

          使用 CFC HTTP 触发器以及 TableStorage 数据库,可以轻松地将 API 托管至云端实现插件化的 API,一方面可以节省计算机资源,另一方面则可以为系统升级、迁移等操作提供便利。

          上一篇
          使用 Terraform 快速搭建图像处理应用
          下一篇
          API参考