API规范

时间:2021-6-4 作者:qvyue

下面以账号表为例,介绍相关api命名、参数、返回值等编写规范。

1、账号详情

接口名称: get
功能说明: 获取某个账号详情
请求参数:

参数名称: 参数类型: 是否必须: 参数说明:
_id ObjectId Y 账号ID

api result schema:account_detail

account_detail:
  strict_mode: true
  model_name: account
  meta: object_result
  data:
    _id:
      type: 'object_id'
      example: '5da57976ce6d2a647d539af0'
      note: 'id'
    name:
      type: 'string'
      example: '张三'
      note: '用户名称'
    group_info:
      type: 'object_ref'
      schema: group_brief

返回结果:

{
    "_id":"5a72897dce6d2a27056b219f",
    "name":"憨憨",
    "group_info": {
         "_id": "5a72897dce6d2a27056b219g",
         "name": "后端组"
    },
}

代码示例:

@api_result('account_detail')
def get(self, params, **kwargs):
    _id = param_convert.object_id_param('_id', params)
    record = api_model_loader.load_account_info(_id)
    return record

2、账号列表

接口名称: find
功能说明: 根据筛选及分页条件获取账号列表
注意事项: 需要考虑根据查询条件构建合适的索引
请求参数:

参数名称: 参数类型: 是否必须: 参数说明:
_meta dict N 分页参数
name string N 名称
state int N 状态

请求示例:

{
    "_meta": {
        "limit": 30,
        "page": 1
    },
    "state": 100
}

api result schema:account_list_item

account_list_item:
  strict_mode: true
  model_name: account
  meta: object_result
  data:
    _id:
      type: 'object_id'
      example: '5da57976ce6d2a647d539af0'
      note: 'id'
    name:
      type: 'string'
      example: '张三'
      note: '用户名称'

返回结果:

{
    "_meta": {
        "has_more": true,
        "page": 1,
        "page_size": 30,
        "result_count": 1148
    },
    "data": [
        {
            "_id": "5a72897dce6d2a27056b219f",
            "name": "憨憨1"
        },
        {
            "_id": "5a72897dce6d2a27056b219e",
            "name": "憨憨2"
        }
    ]
}

代码示例:

@api_result_set_with_meta('account_list_item')
def find(self, params, **kwargs):
    spec = apply_dict_by_rules(params, {
        'name': (
            param_convert.str_param_opt,
        ),
        'state': (
            param_convert.int_param_opt,
        ),
    })
    default_sort = [('_id', -1)]
    return build_result_set_meta(db.Account.find, spec=spec, default_sort=default_sort, params=params)

3、账号创建

接口名称: create
功能说明: 添加新账号
请求参数:

参数名称: 参数类型: 是否必须: 参数说明:
name string Y 名称
phone string Y 手机号
state int Y 状态
group_id object_id N 所属组ID

api result schema:generic_summary

generic_summary:
  strict_mode: true
  meta: object_result
  data:
    _id:
      type: object_id
      example: '5a72897dce6d2a27056b219f'
      note: 对象ID

返回结果:

{
    "_id":"5a72897dce6d2a27056b219f"
}

代码示例:

@api_result('generic_summary')
def create(self, params, **kwargs):
    doc = apply_dict_by_rules(params, {
        'name': (
            param_convert.str_param_opt,
        ),
        'phone': (
            param_convert.str_param_opt,
        ),
        'state': (
            param_convert.int_param_opt,
        ),
        'group_id': (
            param_convert.object_id_param_opt,
        ),
    })
    try:
        biz = AccountBiz.instance()
        record = biz.create_record(doc)
    except RpcRuntimeError as e:
        raise errors.ApiError(zh_message=e.zh_message)
    return record

4、账号编辑

接口名称: update
功能说明: 编辑账号信息
请求参数:

参数名称: 参数类型: 是否必须: 参数说明:
_id object_id Y 名称
name string N 名称
phone string N 手机号
state int N 状态
group_id object_id N 所属组ID

api result schema:generic_summary
返回结果:

{
    "_id":"5a72897dce6d2a27056b219f"
}

代码示例:

@api_result('generic_summary')
def update(self, params, **kwargs):
    record_id = param_convert.object_id_param('_id', params)
    record = api_model_loader.load_account_info(record_id)
    doc = apply_dict_by_rules(params, {
        'name': (
            param_convert.str_param_opt,
        ),
        'phone': (
            param_convert.str_param_opt,
        ),
        'state': (
            param_convert.int_param_opt,
        ),
        'group_id': (
            param_convert.object_id_param_opt,
        ),
    })
    try:
        biz = AccountBiz.instance()
        record = biz.update_record(record, doc)
    except RpcRuntimeError as e:
        raise errors.ApiError(zh_message=e.zh_message)
    return record

5、获取记录详情

接口名称: find_one
功能说明: 获取指定条件的记录详情
场景说明: 通常用于要根据不同纬度来获取一条记录详情,例如通过身份证号或者手机号来定位用户
请求参数:

参数名称: 参数类型: 是否必须: 参数说明:
phone string N 手机号
identity_card_id string N 身份证号

返回结果:

{
    "_id":"5a72897dce6d2a27056b219f",
    "name":"憨憨",
    "group_info": {
         "_id": "5a72897dce6d2a27056b219g",
         "name": "后端组"
    },
}

6、获取全量数据

接口名称: select
功能说明: 不带分页获取所有数据
场景说明: 获取下拉框可选项
注意事项: 只返回需要用到的_id和name字段
请求参数:
返回结果:

{
    "data": [
        {
            "_id": "5a72897dce6d2a27056b219g",
            "name": "后端组"
        },
        {
            "_id": "5a72897dce6d2a27056b219e",
            "name": "产品组"
        }
    ]
}

7、操作类

接口名称: mark_*
功能说明: 操作类标记相关状态
举例说明:

  • 标记完成:mark_done
  • 标记进行中:mark_doing
  • 标记删除:mark_delete
  • 标记取消:mark_cancel
  • 标记关闭:mark_close
  • 打标签:mark_label
  • 标记异常:mark_abnormal

请求参数:

参数名称: 参数类型: 是否必须: 参数说明:
_id object_id Y 主键ID

返回结果:

{
    "ok": true
}

8、批量处理类

接口名称: batch_*
功能说明: 批量操作类
举例说明:

  • 批量添加:batch_add_xxx
  • 批量删除:batch_delete_xxx

请求参数:

参数名称: 参数类型: 是否必须: 参数说明:
_ids list Y 主键ids

返回结果:

{
    "ok": true
}

9、批量操作文档类

接口名称: batch_*
功能说明: 批量添加/编辑
举例说明:

  • 批量创建:batch_create
  • 批量删除:batch_update
  • 批量提交:batch_submit

请求参数:

参数名称: 参数类型: 是否必须: 参数说明:
docs list Y 文档信息列表

请求示例:

{
    "docs": [
        {
            "name": "后端组"
        },
        {
            "name": "产品组"
        }
    ]
}

返回结果:

{
    "ok": true
}

10、支付类

功能说明: 涉及到金额类的操作
举例说明: 充值、提现、转账、收款
特别注意:

  • 接口幂等性
  • 通过一定的策略确保同一单据提供给三方交易系统的单号唯一
  • 通过创建唯一索引来防止重复打款
  • 对于调用第三方交易系统,做成定时任务并使用单进程去执行处理
  • 操作钱包中金额字段时要使用mongodb中原子性的相关操作,例如:inc、pull、$push等

下面以给钱包账号充值为例,我们可以在model中增加如下方法:

def pre_recharge_money(self, money, trans_id):
    """开始充值金额"""
    spec = {
        '_id': self['_id'],
        'pending_transactions': {'$ne': trans_id},
    }
    doc = {
        '$inc': {
            'balance_money': money,
            'frozen_money': money,
        },
        '$push': {
            'pending_transactions': trans_id
        }
    }
    return self.update_doc(spec, doc, check_updated_state=True)

def rollback_recharge_money(self, money, trans_id):
    """回滚充值金额"""
    spec = {
        '_id': self['_id'],
        'pending_transactions': trans_id,
    }
    doc = {
        '$inc': {
            'balance_money': -money,
            'frozen_money': -money,
        },
        '$pull': {
            'pending_transactions': trans_id
        }
    }
    return self.update_doc(spec, doc, check_updated_state=True)

def commit_recharge_money(self, money, trans_id):
    """提交充值金额"""
    spec = {
        '_id': self['_id'],
        'pending_transactions': trans_id,
    }
    doc = {
        '$inc': {
            'frozen_money': -money,
        },
        '$pull': {
            'pending_transactions': trans_id
        }
    }
    return self.update_doc(spec, doc, check_updated_state=True)

注意:针对有些场景api没有定义规范的,需要一起制定完此类情况的开放流程规范后在进行开发。

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。