API 文档 枚举/常量参考 / 变更日志

前言(通用)

前言

本文档包含所有的HTTP API接口描述,并提供在线测试工具。

同时,得益于Callme HTTP Adapter,本系统所有HTTP API接口都可以通过RPC方式调用(详情见下文)

注意:请仔细阅读本文档之后,再实际使用下文揭示的HTTP API接口。

注意:在本页面的操作与实际调用HTTP API具有相同效果,请小心演绎。

注意:无论是从本文档发起调用,还是从浏览器、命令行curl或通过RPC调用,都具有完全相同的效果。所以只要能够从本文档正常发起调用,即可认为HTTP API能够正常使用,故请优先检查自身代码。

API设计(通用)

API设计

本系统接口URL一般规则如下:

/api/{版本}/{操作对象}/{下级操作对象}/{...}/do/{动作}

对于一般的CRUD操作而言,本系统API主要提供以下几种接口:

  • 列表接口:GET /api/{版本}/{操作对象}/do/list
  • 获取接口:GET /api/{版本}/{操作对象}/{操作对象ID}/do/get
  • 添加接口:POST /api/{版本}/{操作对象}/do/add
  • 修改接口:POST /api/{版本}/{操作对象}/{操作对象ID}/do/modify
  • 删除接口:GET /api/{版本}/{操作对象}/{操作对象ID}/do/delete

注意:根据具体业务不同,有的操作对象可能并不会提供所有的上述接口;有的操作对象可能有额外的接口。

注意:超出上述范畴的API以API文档为准。

数据格式

此外,API接口均使用JSON进行数据交换,且一般情况下,字段名称、字符串常量值使用littleCamel风格。如:

{
  "error"  : 200,
  "message": "",
  "data"   : null,
  "traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
  "reqCost": 100
}

表示关联字段的表示

除了一般情况下使用到的littleCamel风格的字段名外,有时会使用到下划线表示关联字段。如:

{
  "error"  : 200,
  "message": "",
  "data": {
    "seq"       : 1,
    "id"        : "data-xxxxxxxxxxxxxxxxxxxxxx",
    "name"      : "XXXX",
    "note"      : null,
    "createTime": "2018-08-29T12:47:00.000Z",
    "updateTime": "2018-08-29T12:47:00.000Z",
    "o_id"      : "o-xxxxxxxx",
    "o_uniqueId": "o-xxxxxxxx",
    "o_name"    : "xxxxxxxx Organization"
  },
  "traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
  "reqCost": 100
}

在上述数据中,data.seqdata.createTime使用littleCamel风格,属于接口操作对象的本身具有的字段。而data.o_iddata.o_name则表示所关联企业的ID、名称等字段,属于关联字段。

为了避免相同字段名冲突,以及明确字段意义。本系统中,操作对象本身具有的字段使用littleCamel风格。而关联对象的字段以<对象简称>_<littleCamel风格的关联对象字段名>方式命名。

本系统内对象的全称与简称举例如下:

对象 全称 全称(复数) 简称
用户 user users u
组织 organization organizations o

注:在URL中,使用中杠连接风格,如user-info

来自外部系统的字段命名方式

由于本系统使用Node.js开发,所以在JSON数据交换时,均使用littleCamel风格。

但不可避免的是,本系统在与外部系统交互时接收到的JSON数据未必同样使用littleCamel风格来命名字段。如:

  • Python项目一般使用下划线分割命名方式:my_variable
  • 阿里云API接口返回内容一般为BigCamel风格:InstanceId

为了避免不必要的麻烦,所有来自外部不可控系统的JSON数据,无论命名规则如何,都会保留原有的命名规则。

理念

本系统API设计与教科书版RESTful风格接口非常相似,但是并没有使用教科书中的GETPOSTPUTDELETEPATCH等HTTP动词。而仅仅使用了最常用的GETPOST,分别用于需要或不需要提交数据的接口。同时,在接口结尾增加/do/{动作},来指明具体的动作行为。

这么做的目的在于避免牵强地套用RESTful的风格(如:如何为用户注册、登陆的过程进行RESTful建模?)。同时降低客户端的开发成本(有些语言的HTTP包并不支持自定义HTTP动词)。

认证

根据业务不同,有些接口需要认证(即用户登录)后才可调用,有些则允许直接调用。

可以根据每个API文档的需要登录标签了解接口是否需要认证。

通过内建用户系统认证

此认证方式由本系统的登录接口实现。

登录成功后,登录接口会返回一个xWatAuthToken作为之后调用其他API时的凭证。此凭证存在有效时间限制(默认为2小时)。但每当此凭证发送至本系统,系统会自动刷新此凭证的有限时间。

根据业务需要和配置,凭证可以通过多种方式发送:

  • HTTP请求头(默认为X-WAT-Auth-Token字段,可配置为禁用)
  • HTTP URL Query参数(默认为xWatAuthToken参数,可配置为禁用)
  • Cookies(xAuthToken字段,可配置为禁用)

注意:

一般页面的请求作为例外,始终支持Cookies方式传递凭证。

正式环境部署时,可单独针对API请求禁用通过Cookies传递凭证,但不影响一般页面通过Cookies传递凭证。

内建认证仅作为调试使用,不推荐提供给用户直接使用。

公共JSON响应字段

所有的API接口都有通用的返回值字段,客户端可以根据这些字段来判断API调用成功与否。

成功调用的JSON响应字段

当API调用成功后返回的JSON中,包含以下字段:

字段名 类型 说明
error Number 固定为200,表示成功。
message String 固定为空字符串,表示无特殊说明。
data Number, String, Array, JSON 返回数据,具体类型根据业务不同而不同。
traceId String TRACE-开头的请求ID,可用于日志查询等。
reqCost Number 本次接口调用耗时(毫秒)。

data字段具体说明见下文

一个典型的API调用成功返回值JSON如下:

{
  "error"  : 200,
  "message": "",
  "data"   : {...},
  "traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
  "reqCost": 100
}

失败调用的JSON响应字段

当API调用失败后返回的JSON中,包含以下字段:

字段名 类型 说明
error Number 4xx.xx,表示客户端错误;5xx.xx表示服务端错误。
message String 错误的文案说明,可用于UI显示。
reason String 错误的标签名称,可用于程序判断。
detail JSON 错误详情,具体类型根据业务不同而不同。
traceId String TRACE-开头的请求ID,可用于日志查询等。

一个典型的API调用失败返回值JSON如下:

{
  "error"  : 404.41,
  "message": "No such instance",
  "reason" : "EClientNotFound",
  "detail": {
    "id": "xxx"
  },
  "traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
  "reqCost": 100
}

列表接口

此类接口主要用于获取操作对象列表。请求方式如下:

GET /api/v1/{操作对象}/do/list

如:

GET /api/v1/data/do/list

分页

绝大部分列表接口都支持分页,客户端可以指定页号(从1开始)和每页记录条数(默认5,最大1000。可由配置文件修改)。

可以根据每个API文档的支持分页标签了解接口是否支持分页。

分页参数如下:

名称 位置 说明
pageNumber URL Query 可选,默认为1。
PageSize URL Query 可选,默认为5。

如:

GET /api/v1/data/do/list?pageNumber=1&pageSize=10

搜索/过滤

绝大部分列表接口都支持过滤条件,客户端可以指定通用搜索_search或具体字段进行过滤。

可以根据每个API文档的详情了解所支持的过滤条件

如:

GET /api/v1/data/do/list?_search=XXXXX

再如:

GET /api/v1/data/do/list?name=XXXXX

列表接口JSON响应字段

列表接口的返回值data字段是一个包含若干个JSON的数组。此外,在支持分页的列表接口返回值中,会额外具有一个pageInfo字段表示分页信息。

分页信息如下:

名称 类型 分页方式 说明
count Integer 普通分页/标记分页 本页记录数
totalCount Integer 普通分页 满足条件的记录总数
pageSize Integer 普通分页/标记分页 实际每页最多记录数
pageNumber Integer 普通分页 当前页号
pageCount Integer 普通分页 总分页数量
pageMarkerField String 标记分页 分页标记字段
pageMarker Any 标记分页 下一页标记值

一个典型的列表接口返回值如下(普通分页):

{
  "error"  : 200,
  "message": "",
  "data": [
    {
      "seq"       : 1,
      "id"        : "data-xxxxxxxxxxxxxxxxxxxxxx",
      "name"      : "XXXX",
      "note"      : null,
      "createTime": "2018-08-29T12:47:00.000Z",
      "updateTime": "2018-08-29T12:47:00.000Z"
    }
  ],
  "pageInfo": {
    "count"          : 1,
    "totalCount"     : 1,
    "pageSize"       : 10,
    "pageNumber"     : 1,
    "pageCount"      : 1,
    "pageMarkerField": null,
    "pageMarker"     : null
  },
  "traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
  "reqCost": 100
}

一个典型的列表接口返回值如下(标记分页):

{
  "error"  : 200,
  "message": "",
  "data": [
    {
      "seq"       : 1,
      "id"        : "data-xxxxxxxxxxxxxxxxxxxxxx",
      "name"      : "XXXX",
      "note"      : null,
      "createTime": "2018-08-29T12:47:00.000Z",
      "updateTime": "2018-08-29T12:47:00.000Z"
    }
  ],
  "pageInfo": {
    "count"          : 1,
    "totalCount"     : null,
    "pageSize"       : 10,
    "pageNumber"     : null,
    "pageCount"      : null,
    "pageMarkerField": "seq",
    "pageMarker"     : 1
  },
  "traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
  "reqCost": 100
}

获取

此类接口主要用于获取操作对象详情。请求方式如下:

GET /api/v1/{操作对象}/{操作对象ID}/do/get

如:

GET /api/v1/data/data-xxxxxxxxxxxxxxxxxxxxxx/do/get

获取JSON响应字段

获取的返回值data字段是一个JSON对象。

一个典型的列表接口返回值如下:

{
  "error"  : 200,
  "message": "",
  "data": {
    "seq"       : 1,
    "id"        : "data-xxxxxxxxxxxxxxxxxxxxxx",
    "name"      : "XXXX",
    "note"      : null,
    "createTime": "2018-08-29T12:47:00.000Z",
    "updateTime": "2018-08-29T12:47:00.000Z"
  },
  "traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
  "reqCost": 100
}

添加接口

此类接口主要用于添加操作对象。请求方式如下:

POST /api/v1/{操作对象}/do/add

{
  "data": {
    ...
  }
}

如:

POST /api/v1/data/do/add

{
  "data": {
    "name": "XXXXX",
    "note": "Just Test!"
  }
}

添加接口JSON响应字段

添加接口的返回值data字段是一个JSON对象。其中,包含一个id字段,表示新建对象的ID。

一个典型的列表接口返回值如下:

{
  "error"  : 200,
  "message": "",
  "data": {
    "id": "data-xxxxxxxxxxxxxxxxxxxxxx"
  },
  "traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
  "reqCost": 100
}

修改接口

此类接口主要用于修改操作对象,请求方式如下:

POST /api/v1/{操作对象}/{操作对象ID}/do/modify

{
  "data": {
    ...
  }
}

如:

POST /api/v1/data/data-xxxxxxxxxxxxxxxxxxxxxx/do/modify

{
  "data": {
    "name": "YYYYY"
  }
}

修改接口可以根据需要仅对部分字段进行修改,故相对于添加接口必选字段很少。

修改接口JSON响应字段

修改接口的返回值data字段是一个JSON对象。其中,包含一个id字段,表示被修改操作对象的ID。

一个典型的列表接口返回值如下:

{
  "error"  : 200,
  "message": "",
  "data": {
    "id": "data-xxxxxxxxxxxxxxxxxxxxxx"
  },
  "traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
  "reqCost": 100
}

删除接口

此类接口主要用于删除操作对象,请求方式如下:

GET /api/v1/{操作对象}/{操作对象ID}/do/delete

如:

GET /api/v1/data/data-xxxxxxxxxxxxxxxxxxxxxx/do/delete

注意:一般来说,被删除的内容无法恢复,客户端在调用此接口前应当要求用户确认后方可进行

删除接口JSON响应字段

删除接口的返回值data字段是一个JSON对象。其中,包含一个id字段,表示被删除操作对象的ID。

一个典型的列表接口返回值如下:

{
  "error"  : 200,
  "message": "",
  "data": {
    "id": "data-xxxxxxxxxxxxxxxxxxxxxx"
  },
  "traceId": "TRACE-XXXXXXXXXXXXXXXXXXXXXX",
  "reqCost": 100
}
字段类型(通用)

本系统中所示使用的字段类型

本系统中大多数字段,根据用途都有相同的字段类型。

本系统常用的字段及其类型如下:

字段 本API文档中类型 MySQL DDL中类型 举例
序号类 Integer BIGINT(20) UNSIGNED seq / actSeq
ID类 String CHAR(65) BINARY (就是区分大小写的意思) accountId / issueId
枚举类 Enum VARCHAR(64) type / levle / status
KEY类 String VARCHAR(64) checkKey / uniqueMarker
名称类 String VARCHAR(256) name
备注类(明显不会很长) String VARCHAR(256) country / city / zip
备注类(明显会很长或无法预估) String TEXT(65535,UTF8) note / address
JSON类 JSON JSON metaJSON / extraJSON
布尔值类 Boolean TINYINT(1) 并转换为true/false格式输出 isDisabled / isTicket
日期类 String TIMESTAMP 并转换为ISO日期格式输出 createTime / expireTime
时间戳 Integer INT(11) dumpTimestamp

根据字段意义特别指定的类型如下:

字段 本API文档中类型 MySQL DDL中类型 举例
邮箱 String VARCHAR(256) email
手机固话 String VARCHAR(32) mobile / telephone
语言 String VARCHAR(10) locale
MD5值 String CHAR(32) md5Sum
文件大小(字节) Integer INT(11) byteSize
文件名 String TEXT(65535,UTF8) originalFileName
文件路径/URL地址 String TEXT(65535,UTF8) webhookURL
HOST名 String VARCHAR(128) host
Access Key(通用)

通过Access Key访问本系统

第三方系统可以通过Access Key IDAccess Secret(下称AK)来访问本系统。

1. 生成AK

可以在Access Key管理页面生成AK

2. 对请求进行签名

对请求进行签名需要以下字段:

字段 描述 示例
AK时间戳 当前UNIX时间戳(秒) 1527532323
AK随机数 一个随机字符串 0.15029408624960117
HTTP方法 全大写HTTP方法 POST
完整请求URL 请求URL(包含Quey参数) /api/v1/path?a=1&b=2
AK签名算法版本 v2新增字段。v1不用传递 v2
原始请求体MD5值 v2新增字段。无请求体的以空字符串''计算MD5值 d41d8cd98f00b204e9800998ecf8427e

目前支持v1v2两种签名算法:

  1. v1签名为:

Hmac-SHA1("<AK时间戳>&<AK随机数>&<HTTP方法>&<完整请求URL>", <AK Secret>)

  1. v2签名为:

Hmac-SHA1("<AK签名算法版本>&<AK时间戳>&<AK随机数>&<HTTP方法>&<完整请求URL>&<原始请求体MD5值>", <AK Secret>)

3. 将签名信息加入请求头

请求头 描述 示例
X-Wat-Ak-Id Access Key ID ak-abcde12345
X-Wat-Ak-Timestamp 签名时所使用的UNIX时间戳 1527532323
X-Wat-Ak-Nonce 签名时所使用的随机字符串 0.15029408624960117
X-Wat-Ak-Sign 签名结果 431f70c44d5f7c97dcc87c20060e2480acdf3a04
X-Wat-Ak-Sign-Version AK签名算法版本,v2新增字段,v1不用传递 v2

4. 发送请求

至此,发送请求即可

Webhook

每个AK支持添加一个URL作为Webhook触发时的调用地址。

当特定的API被调用成功后,系统会向所有Webhook URL发送请求并包含相关信息。

Webhook 签名

系统在向Webhook URL发送请求时,也会按照上述相同的AK签名方式对请求进行签名。

可用资源

本项目已提供了一些已经实现的HTTP客户端,方便第三方系统使用,详见:

编程语言 文件地址 描述
Python sdk/wat_sdk.py 无依赖、支持所有操作。 兼容Python 2.6 ~ 3.7。(文件上传依赖requests包)
Node.js sdk/wat_sdk.js 无依赖、无需编译。(文件上传依赖form-data包)
Golang sdk/main.go 无依赖。(注意使用时需要修改package名称)
部署

设计文档见链接

由于CoreStone 本身也作为一个API 网关的角色存在, 并且在处理请求时,按照请求头中的Host 字段来区分请求的具体处理方式。

所以在部署CoreStone 时,对域名配置有一定要求。

概要

CoreStone 系统中的转发系统包含业务系统接收命名空间前端域名后端域名转发规则模拟规则概念,简要逻辑如下:

  1. 业务系统:表示一个业务系统(如:Shrine后端等)
  2. 接收命名空间:表示一个业务系统允许接收的用户所属的命名空间。在登录账号互通的情况下,一个业务系统可以添加多个接收命名空间,允许不同命名空间下的用户发送请求给自身。
  3. 前端域名:表示客户端请求的域名。一般每个业务系统都至少有一个前端域名,支持公网解析但IP均指向CoreStone 本身。
  4. 后端域名:表示客户端请求转发后的最终目的地址。每个业务系统都至少要有一个,并设置默认转发后端域名。只需CoreStone 能够解析即可。
  5. 转发规则:表示某些团队下的所有/部分登录账号的请求会被转发到指定的后端域名。主要用于灰度发布/AB测试等。
  6. 模拟规则:表示业务系统的某些接口可以由CoreStone 直接返回固定内容。主要用于在业务系统某些接口未开发完成时的兼容处理。

设计文档见链接

配置CoreStone 本身域名

部署CoreStone 时,需要有一个域名指向CoreStone 本身, 用于判断是否请求目标为CoreStone 本身的API。如:core-stone.cloudcare.cn。 与此同时,将此域名写入配置文件中的coreStone.hostnames(数组)字段中。

当CoreStone 接收到Host 头为CoreStone 本身的域名时,会自行处理,而不会转发到后端服务器。

添加业务系统

直接在CoreStone 界面上操作,注意使用有意义的名称即可。

为业务系统配置接收命名空间

每个业务系统都需要有配置接收命名空间(支持多个)。

对于已登录的用户,当请求试图转发至某个业务系统时, CoreStone 首先会检查是否接收此用户所属的命名空间。

如接受此用户所属的命名空间,则按照正常登录用户流程转发请求。

如验证未通过,请求依然会转发到后端域名, 但不会包含有关用户的信息(即作为未登录用户的请求)。

前端域名

前端域名指的是客户端(浏览器、手机APP等)发起请求时的请求地址(包含在Host 请求头中)。

这个域名需要在公网能解析,同时都指向CoreStone 服务器, 如: shine-via-core-stone.cloudcare.cn

此地址允许直接填写IP地址。

后端域名

后端域名指的是客户端发起的请求最终的转发目的地址。

这个域名只需要CoreStone 能够解析即可(如内网DNS,内网IP和Port), 如:192.168.1.100:8088

此地址允许直接填写IP地址。

转发额外配置(高级)

一般针对每一个业务系统,都需要在CoreStone 中配置一个前端域名(允许多个), 和一个后端域名(允许多个,但必须设置一个为默认)。

对于多个前端域名,客户端无论请求哪个前端域名效果都相同。

对于多个后端域名,客户端的请求在转发时,无特殊规则都会转发到默认后端域名。 在此基础上,可以配置某个团队下所有/部分登录账号的请求转发到指定的后端域名, 以实现类似灰度发布/AB测试等效果。

注意:前端域名不能与后端域名相同,否则可能会导致请求循环转发

为业务系统配置转发规则

每个业务系统都会有一个默认转发的后端地址。

在此基础上,可以针对某个团队下的所有/部分登录账号指定转发目标。

此功能主要用于测试/灰度发布/AB测试等用途。

为业务系统配置模拟规则

每个业务系统可以配置模拟规则。

当请求匹配HTTP 请求方法、URL 地址(支持/data/:param语法)时, CoreStone 会直接返回预先指定的内容,且优先级高于正常转发。

此功能主要用于接口兼容、生成假数据等用于。

请求转发

注意:所有操作以实际接口说明文档为准

设计文档见链接

转发过程

CoreStone 支持两种转发方式:

  1. 通过前端地址转发
  2. 通过请求头中指定业务系统转发

其中,第二种方式可以不配置前端域名。

但无论何种方式,后端域名必须进行配置。

通过前端地址方式转发

当App、Web应用通过前端地址转发时,CoreStone 会首先提取请求头中Host字段, 并根据以下规则依次匹配并执行转发:

  1. Host指向自身(配置文件中指定),自CoreStone 自行处理请求
  2. Host指向某个业务系统,则转发至此业务系统
  3. Host无法找到任何匹配的目标,则拒绝本次请求

通过在Query中指定业务系统前端域名转发

在某些情况下,没有条件为每个业务系统的前端地址实际配置DNS, 那么可以采取在请求头中直接指定业务系统的前端域名进行转发。

操作方式为请求Query中添加xCoreStoneBizSystemHost=<业务系统前端域名>来指定请求发往的业务系统。

业务系统接收转发请求并获取用户信息

对于已登录的用户,客户端在发起请求时, 需要在请求中添加额外字段来传递认证令牌(登录成功后返回的认证令牌)。

目前认证令牌支持以下几种方式传递:

  • HTTP 请求头中添加X-Core-Stone-Auth-Token字段。
  • HTTP Query中添加xCoreStoneAuthToken字段。

请求发送到CoreStone 后,CoreStone 会对认证令牌进行验证。

如验证通过,则正常转发请求到后端域名, 并在HTTP 请求头中额外添加X-Core-Stone-Auth-Info-Token传递认证信息。

认证信息(CoreStoneAuthInfo)是一个通过JWT签名后的令牌,解析后结构如下:

字段 说明
account 登录账号信息
account.id 登录账号ID
account.namespace 登录账号所属命名空间
account.tags 登录账号附带的标签
team 登录账号当前团队信息
team.id 登录账号当前团队ID
team.tags 登录账号当前团队附带的标签
teamRoles 登录账号在本团队中的角色列表
teamRoles[#].id 登录账号在本团队中的角色ID
teamRoles[#].isSystem 登录账号在本团队中的角色是否为系统内建角色
permissions 登录账号在本团队中的权限列表(已根据角色+额外权限归并)
permissions[#].id 登录账号在本团队中的权限ID(为具有语义的字符串,如:buildIn.admin.RO
extra 额外信息
extra.authTokenId 所使用的认证令牌ID(可用于作废认证令牌)
extra.authTokenMarker 所使用的认证令牌标记(可用于作废认证令牌)

如验证未通过,请求依然会转发到后端域名, 但不会包含有关用户的信息(即作为未登录用户的请求)。

跟踪ID(Trace ID)

由于当前整体系统架构进行了分层, 一个请求会连续经过多个系统处理后才会最终响应回到客户端, 这对一些错误的排查带来了挑战。

跟踪ID的目的在于在全局范围内跟踪每一个客户端发出的请求, 并在方便在日志系统中查找与此请求相关的所有日志(即使这些日志由不同的系统产生)。

跟踪ID的产生和使用规范

客户端请求在发送到CoreStone 之后,CoreStone 会生成一个格式为TRACE-<UUID> 的跟踪ID。 并在转发时,在HTTP 请求头中额外添加X-Trace-Id字段传递本跟踪ID。

业务系统/基础系统在接收到请求后,应当从HTTP 请求头X-Trace-Id中获取跟踪ID, 并以此跟踪ID初始化日志对象,并在打印日志时,每一行日志都应包含此跟踪ID。

注意:如业务系统需要继续调用基础系统,也应在HTTP 请求头中添加此跟踪ID

注意:如觉得跟踪ID过长,可以只打印TRACE-<UUID前8个字符>

跟踪ID返回至客户端

由于目前所有请求都经由CoreStone 转发, 所以在最终响应客户端时,CoreStone 自动会将生成的跟踪ID 写入HTTP 响应头X-Trace-Id中, 业务系统在响应请求时,无论在HTTP 响应中是否添加跟踪ID 都没有关系。

即:CoreStone作为跟踪ID的创建者,同时会将跟踪ID传递给客户端; 业务系统作为跟踪ID使用者,只需在必要之处输出跟踪ID即可。

账户体系

注意:所有操作以实际接口说明文档为准

设计文档见链接

概要

CoreStone 系统中的账户系统包含团队登录账号概念,简要逻辑如下:

  1. 团队:使用我公司服务或产品的团队,名称可为昵称(如:上海驻云)
  2. 登录账号:所属于客户并实际进行登录及操作的账号 (如:zhang3@jiagouyun.com
  3. 团队与登录账号之间关系为 N:N 。即一个团队可以包含多个登录账号;一个登录账号也可属于多个团队。
  4. 团队类型分为单用户团队多用户团队,单用户团队为仅包含本登录账号的团队,无法进行添加/修改/删除成员的操作。单用户团队主要在登录账号创建/团队删除登录账号后,登录账号无所属团队时自动创建。
  5. 登录账号存在命名空间属性,不同命名空间下的登录账号完全隔离,即使同名,也认为是不同登录账号。
  6. 登录账号的命名空间会影响请求是否允许转发、请求的转发目的。
  7. 各系统的注册、登录、登出页面和接口由各个系统通过调用本系统相关API自行实现。
  8. 内建团队角色:CoreStone定义的基本团队角色
  9. 内建权限:CoreStone定义的基本权限(不附带访问规则)
  10. 权限:由业务系统自定义的权限(可附带访问规则)
  11. 访问规则:由业务系统自定义的访问规则,可指定HTTP方法、路由(带模式匹配),允许或禁用,优先级
  12. 团队角色:每个团队可自定义添加的角色,可以附加内建权限和权限
  13. 额外权限:允许在团队角色的基础上,额外为登录账号直接增加的权限

单词表见链接

用户注册

涉及接口:

  • 添加登录账号

通常而言,对于独立用户系统,一般流程即向本地数据库写入公司/用户数据。

而在对接CoreStone 之后,原有的业务逻辑需要进行修改为调用本系统的添加登录账号API。

passwordEncryptTypepasswordSalt字段

本字段主要用于向旧有独立用户系统兼容所用。

字段 意义
passwordEncryptType 密码加密方式(如:buildIncloudcare等)
passwordSalt 密码盐值

由于本系统、旧有系统的密码加密方式、密钥、盐值策略各不相同,需要对密码进行区分处理。

对于已经对接后,新注册的团队/登录账号,除非有特殊需求,本字段留空即可。

添加登录账号的同时,加入团队

添加登录账号的同时,可以额外指定加入的多用户团队

正确指定加入的团队后,登录账号会在创建的同时加入团队,并存在以下额外处理:

加入团队 额外处理
不指定团队 自动创建一个单用户团队,并将本登录账号加入其中,并作为默认登录,是管理员
指定团队,且任何一个团队都不是默认登录 自动创建一个单用户团队,并将本登录账号加入其中,并作为默认登录,是管理员
指定团队,且存在一个团队为默认登录 无额外处理

即在最终效果看来,任何一个登录账号必然存在一个默认登录的团队

升级为团队版

涉及接口:

  • 修改团队

登录账号的团队如果为单用户团队,那么对应到CloudCare 业务体系中被称为「个人版」。

当「个人版」升级为「团队版」时,仅需在CoreStone 中修改团队为多用户团队,而不必额外创建团队。

注意:只能由单用户团队修改为多用户团队,不支持从多用户团队退回单用户团队

后台直接开设登录账号

涉及接口:

  • 添加登录账号

此操作与上述「用户注册」并无区别。

后台直接开设团队

涉及接口:

  • 添加团队

此操作在一般CloudCare 业务体系中并不存在, 但有可能存在为公司内部工作人员创建团队的情况。

注意:添加团队接口只能创建多用户团队

团队成员操作、团队角色/额外权限的添加/修改

涉及接口:

  • 向团队添加登录账号(附带团队角色/额外权限)
  • 修改团队中登录账号(附带团队角色/额外权限)
  • 从团队中删除登录账号

当需要修改团队成员时,调用相应的API 接口即可, 此类API 接口都支持批量操作。

注意:团队成员操作不适用于单用户团队

将登录账号从默认登录团队中删除

将登录账号从默认团队中删除后,系统会自动查找此登录账号加入的其他团队,并作以下额外处理:

其他加入的团队 额外处理
不存在 自动创建一个单用户团队,并将本登录账号加入其中,并作为默认登录,是管理员
存在 根据加入顺序,自动将此登录账号最后一个加入的团队设置为默认登录团队

即在最终效果看来,任何一个登录账号必然存在一个默认登录的团队

用户登录

涉及接口:

  • 直接创建认证令牌

对于CoreStone 本身,任何登录账号的认证令牌均可以直接创建。 各业务系统自行规定创建和发行时机。

对于需要使用密码登录创建认证令牌时, 应在API 接口中额外传递password供CoreStone 进行计算比对。

登录成功后,CoreStone 会返回coreStoneAuthToken(CoreStone认证令牌)。 客户端直接在请求头(X-Core-Stone-Auth-Token) 或Query(xCoreStoneAuthToken)中附带此内容即可被CoreStone 授权。

用户登出

涉及接口:

  • 作废认证令牌(对应客户端登出操作)

对于CoreStone 本身,认证令牌可以直接销毁。

作废认证令牌支持按认证令牌、登录账号ID等批量作废,用于支持踢出用户/强制下线等处理。

Token认证还是AK认证,这是个问题

CoreStone 本身提供了用户认证(通过发行认证令牌)和转发, 与此同时,所有基于WAT 的系统都支持AK 方式认证。

而一个查询请求是经过业务系统,还是直接发到CoreStone, 是有明确的业务场景区分的,并不是一个模棱两可的事情。

认证令牌认证的是登录账号;AK认证的是业务系统

首先,App/Web等终端用户登录后得到的认证令牌, 是「颁发给这一个登录账号的认证令牌」, 用这个认证令牌经过的认证原则上是只能访问「这个登录账号所属团队的数据」。

经过业务系统「转发」,实际上并不是真正的转发, 而是「业务系统接收到前端请求后,重新以业务系统的名义向CoreStone 发起请求」。 这个时候认证用的是系统间AK方式来认证的,权限比登录账号的认证令牌要大许多, 并且允许访问任何团队/登录账号的数据。

这两者具有本质区别的, 简而言之,认证令牌认证的是登录账号;AK认证的是业务系统

举个例子:

Home中查询团队下属所有登录账号, 必须要提供「当前用户所属团队ID」作为过滤条件。

而Shrine中查询团队下属所有登录账号,十有八九是「销售或服务人员查询客户团队下属登录账号」。 这种情况下,存在跨团队的数据访问,必须用系统间AK认证方式调用, 传递的团队ID也不是「当前销售/服务人员登录账号的ID」而是「目标客户的ID」。

认证令牌直接直接发往CoreStone 的情形

CoreStone 允许接收允许登录账号认证令牌, 本身是因为CoreStone 底层代码(以下简称WAT)的一个数据隔离机制, 这个机制只有在WAT 项目作为「业务系统」的时候才能体现出好处。

好处主要在于,依靠WAT 底层数据隔离机制,会根据每个数据模型的配置, 自动在SQL语句中插入类似WHERE TeamID = '<Team ID>' AND AccountID = 'Account ID'的条件语句。 保证开发人员在编写业务代码的时候,不用关注团队问题(也就是多租户问题), 直接写SQL查出来的就是本团队的数据。

目前WAT 没有使用在任何业务系统中, 所以这个机制暂时没有实际体现。

Socket.io 支持

CoreStone 本身提供了Socket.io 的支持。 Web/App等客户端只需接入CoreStone 的Socket.io,即可与所有业务系统通过Socket.io 进行通讯。 业务系统也同时可以通过CoreStone 与客户端进行通讯。

为了方便客户端以及业务系统开发,集中处理Websocket 连接、消息。 所有的客户端实际都只和CoreStone 保持Websocket 连接, 而CoreStone 与业务系统之间并无Websocket 连接。

当客户端向业务系统发送Websocket 数据包时, 消息通过Websocket 协议到达CoreStone 之后, 会被转换为HTTP 请求,以WebHook 的方式转发给业务系统。

相反,业务系统希望向客户端发送Websocket 数据包时, 直接调用CoreStone 的相关接口即可。 CoreStone 在接收到业务系统有关Socket.io 的调用后, 向相关的客户端推送Websocket 数据包。

从整体上来说,仅需要客户端增加Socket.io 的开发, 在业务系统中依然是标准、普通的HTTP请求。

版本

CoreStone 集成的Socket.io 版本为 2.X,且Socket.io 2.X 与 1.X 并不兼容。 客户端在接入时应当选择使用支持Socket.io 2.X 版本的第三方库。

客户端的对接

对于Web端,只需在HTML代码中引用CoreStone 本身提供的Socket.io 客户端即可:

<script type="text/javascript" src="/socket.io/socket.io.js"></script>

对于移动端,请参考官方提供的资源选择合适的客户端: socket.io - Other-client-implementations

连接服务器

Web端为例,前端对接CoreStone 的Socket.io 服务器(与HTTP复用端口), 使用以下代码即可与CoreStone 建立Websocket 连接:

var socketIO = io();

需要注意的是, 由于Socket.io 对错误处理上的封装, 服务器再向客户端发送错误时,必须使用Error对象, 且客户端实际接收到的是此Error对象的message内容(字符串)。

为了方便统一处理,CoreStone 规定,在与客户端之间数据交互时, 所有的数据包都是JSON字符串(即JSON.stringify(data))。

认证

当Socket.io 服务器连接成功后,服务器会立刻发送一段欢迎信息, 客户端可以使用以下方式接收到此欢迎信息:

socketIO.on('hello', function(data) {
  console.log(data); // "Welcome, please sent X-Core-Stone-Auth-Token string as `auth` event for authentication."
});

根据提示,客户端将X-Core-Stone-Auth-Token字符串作为auth事件发送给服务器:

socketIO.emit('auth', '<X-Core-Stone-Auth-Token>');

服务器会响应一个数据包给客户端,作为是否成功的判断依据,详情见下文「发送消息回应(ACK)」

当服务器响应200表示认证成功,客户端可以进行下一步操作。 否则,请根据提示排查问题。

接收消息

任何以socketio.开头的事件都能够被客户端接受, 事件名称需要客户端与具体业务系统之间协商决定, 且避免以.ack结尾(.ack结尾的事件一般用作响应使用,详见下文「发送消息回应(ACK)」)。

socketIO.on('socketio.newMessage', function(data) {
  console.log(data);
});

发送消息

客户端认证之后可以向CoreStone 发送消息(实际向业务系统广播)。

Socket.io 的消息最终都会通过WebHook 转发给业务系统。 在转发时, 客户端发送的事件event即WebHook调用时的事件event; 客户端发送的数据data即WebHook调用时的数据data。 为了避免混淆,客户端发送的所有Socket.io 事件都必须以socketio.开头,如socketio.message。 同样,客户端接收到的来自业务系统的Socket.io 事件也都会以socketio.开头。

可以使用以下方式发送一条消息:

var data = {"hello": "world"};
socketIO.emit('socketio.message', JSON.stringify(data));

消息响应(ACK)

客户端向服务器发送的任何一条消息,服务器都会有响应(ACK)。

注意:消息响应(ACK)来自CoreStone, 仅表示CoreStone 正确处理了客户端发来的消息。 并不代表后续业务系统正确处理了消息。 业务系统处理结果以业务系统发出的消息为准

响应(ACK)有以下几种:

  1. Socket.io 内建的响应,通过相同事件event名称发回客户端
  2. CoreStone 实现的响应,通过<事件>.ack发回客户端
  3. 错误响应,通过error事件发回客户端

服务器的响应数据包为一个JSON字符串,包含以下字段:

字段名 类型 说明
error Number 错误码。整数部分与HTTP状态码意义相同,200表示OK。
message String 错误信息。正常时为空字符串
data Number, String, Array, JSON 成功响应的数据。可能包含相关数据
reason String 发生错误原因。
ackId String 响应ID。由客户端在发送数据包时指定。

如表示成功的数据包如下:

{
  "error"  : 200,
  "message": "",
  "data"   : null
}

再如表示登录失败的数据包如下:

{
  "error"  : 401.92,
  "message": "Invalid Auth Token.",
  "reason" : "EAuthToken"
}

这两种响应服务器都会发送,客户端选择其中一种接收即可。

接收Socket.io 内建的响应

对于Socket.io 内建的响应,直接指定emit()函数的回调方法即可:

var data = {"hello": "world"};
socketIO.emit('socketio.message', JSON.stringify(data), function(ack) {
  console.log(ack); // ack即响应数据包
});

接收CoreStone 实现的响应

对于CoreStone 实现的响应,直接监听<事件>.ack即可:

socketIO.on('socketio.message.ack', function(ack) {
  console.log(ack); // ack即响应数据包
});

var data = {"hello": "world"};
socketIO.emit('socketio.message', JSON.stringify(data));

此外,为了方便客户端判断每个响应所对应的数据包, 客户端在发送消息时,可以附带一个ackId字段,值由客户端自行生成。 服务器在响应(ACK)时,会将字段原样返回:

socketIO.on('socketio.message.ack', function(ack) {
  console.log(ack.ackId); // "12345"
});

var data = {"hello": "world", "ackId": "12345"};
socketIO.emit('socketio.message', JSON.stringify(data));

接收错误响应

对于错误响应,直接监听error即可:

注意:所有的错误都会通过error事件发出, 正常响应(ACK)中并不会接受到任何有关错误的响应

socketIO.on('error', function(error) {
  console.log(error);
});

业务系统的对接

业务系统除了在原先接收WebHook 的基础上做更多event的区分处理外,无其他额外工作。

接受消息

由客户端发出的Socket.io 事件经由CoreStone 通过WebHook 方式转发后,会有如下字段:

字段名 类型 说明
event String 事件,即客户端指定的事件,一定以socketio.开头
from JSON 消息来源,内部各字段说明见下文
data JSON 消息数据包,即客户端发送的数据包,通过WebHook转发时会被解析为JSON

消息来源from中各字段说明如下:

各字段说明如下:

字段名 类型 说明
type Enum 类型 socketIOClient
socketIOClientId String Socket.io 客户端ID(由Socket.io自动生成)
accountId String 登录账号ID
namespace String 登录账号命名空间
teamId String 团队ID
authTokenId String 认证令牌ID
authTokenMarker String 认证令牌标记(详情见CoreStone中直接创建认证令牌API说明)

发送消息

调用CoreStone API 接口即可,详情见「发送Socket.io 消息」。

全域广播

调用CoreStone API 接口即可,详情见「发送Socket.io 全域广播消息」。

WebHook 列表

在特定操作执行成功后,会触发WebHook,并向在AccessKey 列表中注册的WebHook URL 发送HTTP POST 请求。

一个典型的WebHook 的请求体如下:

{
  "isEcho": false,
  "event" : "team.added",
  "from": {
    "socketIOClientId": "XXXXXXX-XXXXXXXXXXXX",
    "accountId"       : "acnt-XXXXXXXXXXXXXXXXXXXXXX",
    "namespace"       : "default",
    "teamId"          : "team-XXXXXXXXXXXXXXXXXXXXXX",
    "authTokenId"     : "csat-XXXXXXXXXXXXXXXXXXXXXX",
    "authTokenMarker" : "web"
  },
  "data": {
    "id"       : "team-XXXXXXXXXXXXXXXXXXXXXX",
    "name"     : "上海驻云",
    "email"    : "postmaster@jiagouyun.com",
    "telephone": "02100000000",
    "mobile"   : "18000000000",
    "industry" : "云计算",
    "country"  : "中国",
    "province" : "上海",
    "city"     : "上海市",
    "district" : "云计算浦东新区",
    "address"  : "张江创新园",
    "zip"      : "200000"
  }
}

各字段说明如下:

字段名 类型 说明
isEcho Boolean 此Webhook 回调是否为「回声」
event String 触发事件,一般格式为<实体>.<所完成的操作>
from JSON 触发来源
data JSON 本次WebHook 回调的数据包,不同事件字段也不同

注:当某个业务系统调用本系统某些接口触发Webhook 之后,Webhook 请求有可能又会发送到同一个业务系统,这被称为「回声」

注:from字段主要在客户端通过Socket.io触发事件时,填入客户端的详细信息。如本事件为系统内触发,则本字段保持为null

注:具体数据包格式见下文

触发来源

各字段说明如下:

字段名 类型 说明
type Enum 类型 socketIOClient
socketIOClientId String Socket.io 客户端ID(由Socket.io自动生成)
accountId String 登录账号ID
namespace String 登录账号命名空间
teamId String 团队ID
authTokenId String 认证令牌ID
authTokenMarker String 认证令牌标记(详情见CoreStone中直接创建认证令牌API说明)

注:Socket.io 客户端触发的事件,事件命名一定为`socketio.`格式*

登录账号

登录账号已新建

触发事件:account.added

数据包结构:

字段名 类型 是否必须 说明
id String 必须 新增的登录账号ID
namespace String 必须 命名空间
mobile String 可选 手机
email String 可选 邮箱
username String 可选 用户名
isDisabled Boolean 可选 是否已禁用
teams Array[JSON] 可选 创建时同时加入的团队列表
teams[#].id String 必须 加入的团队ID
teams[#].isDefault Boolean 可选 是否为默认登录团队
teams[#].isAdmin Boolean 可选 是否为管理员
tags JSON 可选 新增标签

登录账号已修改

触发事件:account.modified

数据包结构:

字段名 类型 是否必须 说明
id String 必须 修改的登录账号ID
namespace String 可选 命名空间
mobile String 可选 手机
email String 可选 邮箱
username String 可选 用户名
isDisabled Boolean 可选 是否已禁用
tags JSON 可选 修改标签

登录账号已切换默认登录团队

触发事件:account.defaultTeamSwitched

数据包结构:

字段名 类型 是否必须 说明
id String 必须 切换默认登录团队的登录账号ID
defaultTeamId String 必须 切换后的默认登录团队ID

团队

团队已新建

触发事件:team.added

数据包结构:

字段名 类型 是否必须 说明
id String 必须 新建的团队ID
type Enum 可选 团队类型 singleAccount / multiAccount
name String 必须 名称
uniqueMarker String 必须 标示
email String 可选 邮箱
telephone String 可选 固定电话
mobile String 可选 手机
industry String 可选 行业
country String 可选 国家
province String 可选 省份
city String 可选 城市
district String 可选
address String 可选 地址
zip String 可选 邮政编码
status Enum 可选 团队状态 normal(预留字段,暂无用途)
accounts Array[JSON] 可选 创建时同时加入的登录账号列表
accounts[#].id String 必须 加入的登录账号ID
accounts[#].isDefault Boolean 可选 是否为默认登录本团队
accounts[#].isAdmin Boolean 可选 是否为管理员
tags JSON 可选 新增标签

团队已修改

触发事件:team.modified

数据包结构:

字段名 类型 是否必须 说明
id String 必须 修改的团队ID
type Enum 可选 团队类型 singleAccount / multiAccount
uniqueMarker String 可选 标示
name String 可选 名称
email String 可选 邮箱
telephone String 可选 固定电话
mobile String 可选 手机
industry String 可选 行业
country String 可选 国家
province String 可选 省份
city String 可选 城市
district String 可选
address String 可选 地址
zip String 可选 邮政编码
status Enum 可选 团队状态 normal(预留字段,暂无用途)
isCanceled Boolean 可选 是否已注销
isDisabled Boolean 可选 是否已禁用
tags JSON 可选 修改标签

团队已新增登录账号

触发事件:team.accountsAdded

数据包结构:

字段名 类型 是否必须 说明
accounts Array 必须 加入的登录账号列表
accounts[#].id String 必须 登录账号ID
accounts[#].isDefault Boolean 可选 是否为默认登录本团队
accounts[#].isAdmin Boolean 可选 是否为管理员
accountIdsAlreadyInTeam Array[String] 可选 加入的登录账号列表中,重复加入的登录账号ID列表
accountIdsAlreadyInTeam[#] String 必须 登录账号ID

团队已修改登录账号

触发事件:team.accountsModified

数据包结构:

字段名 类型 是否必须 说明
accounts Array 必须 修改的登录账号列表
accounts[#].id String 必须 登录账号ID
accounts[#].isDefault Boolean 可选 是否为默认登录本团队
accounts[#].isAdmin Boolean 可选 是否为管理员

团队已删除登录账号

触发事件:team.accountsDeleted

数据包结构:

字段名 类型 是否必须 说明
accounts Array 必须 删除的登录账号列表
accounts[#].id String 必须 登录账号ID
accountIdsNotInTeam Array[String] 可选 删除的登录账号列表中,重复删除的登录账号ID列表
accountIdsNotInTeam[#] String 必须 登录账号ID
通过Kafka 接收WebHook

本系统除了通过传统HTTP请求发送Webhook数据外, 同时支持通过Kafka发送Webhook数据。

由基础系统发出的Webhook数据,都会发往basis主题, 同时,为了保证接收方能够按照顺序接受到消息,所有的消息都会发往0号分区。

通过Kafka发送的Webhook数据与传统HTTP请求发送的Webhook相同,但不会有isEcho字段。

详细对接文档请参考 301.06-Kafka 对接说明

注意:基础系统只负责通过Kafka发送Webhook数据,本身并不接收任何Kafka消息。

注意:基础系统并不强制要求业务系统接入Kafka,如何使用请根据实际情况决定。

注意:基础系统同时会以传统HTTP方式和向Kafka发送Webhook数据, 为了避免重复接受消息,业务系统在切换为Kafka之后,必须删除本系统中有关Webhook URL的配置。

Ping test

  /api/v1/do/ping

/api/v1/do/ping


描述

Ping test.
Echo test

  /api/v1/do/echo

/api/v1/do/echo


描述

Echo test.

请求体

字段 类型 描述 测试
echo any Any value
skip :
DEBUG - Put async task

  /api/v1/debug/tasks/do/put

/api/v1/debug/tasks/do/put


描述

CAUTION: This API is just for debug, please DO NOT use in a production environment.

请求体

字段 类型 描述 测试
waitResult boolean Wait task result before response
times int Send times
最小值为 : 1
task json
task.name string Task name
task.args array List arguments (*args)
task.args[#] any
task.kwargs json Dict arguments (**kwargs)
task.options json Task options
task.options.queue string 队列
task.options.eta int ETA (Unix timestamp in seconds)
task.options.expires int Expires (Unix timestamp in seconds)
task.options.retries int Retry times
最小值为 : 0
task.options.timeLimit int Time limit (in seconds)
最小值为 : 1
task.options.softTimeLimit int Time soft limit (in seconds)
最小值为 : 1
task.options.origin string origin
task.options.priority int Priority
最小值为 : 0
最大值为 : 255
task.options.extra any Extra information
批量请求

  /api/v1/core-stone/do/batch-request

/api/v1/core-stone/do/batch-request


描述

批量请求的返回内容严格按照body.requests顺序一一对应,如:

{
  "error": 200,
  "message": "",
  "data": [
    {
      "status"     : 200,
      "contentType": "application/json; charset=utf-8",
      "body": {
        "data": "第1个请求返回值"
      }
    },
    {
      "status"     : 200,
      "contentType": "application/json; charset=utf-8",
      "body": {
        "data": "第2个请求返回值"
      }
    },
  ],
  "traceId": "TRACE-00000000-0000-0000-0000-000000000000",
  "reqCost": 21
}

可选批量请求模式:

模式 说明
parellel 并发请求(同一时间实际最大并发量限制为10)
series 顺序请求

HTTP头

字段 类型 描述 测试
X-Core-Stone-Auth-Token string CoreStone认证令牌

请求体

字段 类型 描述 测试
mode enum 批量请求模式(默认为`parellel`)
为以下其中之一 :
 "parallel",
 "series"
requests array
最小长度为 : 1
最大长度为 : 100
requests[#] json
requests[#].host string 请求前端地址(默认为当前请求地址)
requests[#].method enum 请求方法
为以下其中之一 :
 "GET",
 "POST",
 "PUT",
 "DELETE",
 "PATCH",
 "OPTION"
requests[#].path string 请求路径
requests[#].query json 请求Query
requests[#].contentType string 请求体内容类型(默认根据所发送body自动判断)
requests[#].body any 请求体(字符串或JSON)
DEBUG - Socket.io

  /debug/socket-io

/debug/socket-io


描述

注意:本接口仅供测试使用,请勿在生产环境中使用。

业务监控:获取业务实体状态

  /api/v1/biz-monitor/biz-stats/do/get

/api/v1/biz-monitor/biz-stats/do/get


Query参数

字段 类型 描述 测试
_flushCache boolean 清理缓存
业务监控:清除转发记录

  /api/v1/biz-monitor/biz-stats/dispatch/do/clear

/api/v1/biz-monitor/biz-stats/dispatch/do/clear


发送Socket.io 消息

  /api/v1/socket-io/do/emit

/api/v1/socket-io/do/emit


描述

向Socket.io 客户端发送消息,可以按Socket.io 客户端ID、登录账号ID或团队ID进行发送

Socket.io 客户端ID 登录账号ID 团队ID 实际接收者
指定 指定的单个Socket.io 客户端
指定 指定登录账号ID的所有已登录的Socket.io 客户端
指定 指定团队ID的所有已登录的Socket.io 客户端
指定 指定 所属指定团队ID下指定登录账号ID的所有Socket.io 客户端(用于支持多端登录不同团队的情况)

注意:当指定Socket.io 客户端ID时,不得同时指定登录账号ID和团队ID

注意:当同时指定登录账号ID和团队ID时,只支持一个团队ID+一个或多个登录ID的方式组合指定

请求体

字段 类型 描述 测试
event string 消息事件(必须为`socketio.*`格式或`error`)
data json 消息数据
to json
to.socketIOClientId commaArray Socket.io客户端(接收者)ID
允许为Null :
不得为空字符串 :
to.teamId commaArray 团队(接收者)ID
允许为Null :
不得为空字符串 :
to.accountId commaArray 登录账号(接收者)ID
允许为Null :
不得为空字符串 :
发送Socket.io 全域广播消息

  /api/v1/socket-io/do/broadcast

/api/v1/socket-io/do/broadcast


请求体

字段 类型 描述 测试
event string 消息事件(必须为`socketio.*`格式或`error`)
data json 消息数据
验证登录账号

  /api/v1/core-stone-auth/do/verify-account

/api/v1/core-stone-auth/do/verify-account


描述

用于验证用户账号的信息:

普通账号 LDAP用户
确认登录账号是否存在 确认LDAP用户是否存在
确认密码是否正确(仅在password字段填写时检查) 确认LDAP用户密码是否正确(仅在password字段填写时检查)
确认登录账号是否已被禁用 确认此LDAP用户在CoreStone中是否已被禁用
确认登录账号是否为团队成员(仅在signInTeamId字段填写时检查) 确认登录账号是否为团队成员(仅在signInTeamId字段填写时检查)

以ID或验证LDAP用户时,命名空间namespace无需填写。

LDAP用户验证

指定标识符类型identifierType"ldap"即为验证LDAP用户。

验证LDAP用户时,标识符identifier必须以"<团队标示/LDAP用户名>"格式传递,如:"jiagouyun/zhang3"

注意:LDAP登录默认根据uid进行处理,如果希望以username登录,请选择"ldap.username"

第一次验证成功后,CoreStone会自动创建一个命名空间为"ldap.<团队唯一标示>"的登录账号。(驻云1号团队为"ldap.jiagouyun"

注意:本接口不会创建令牌

注意:LDAP用户在验证时,会自动在本系统中添加/更新LDAP用户信息

请求体

字段 类型 描述 测试
verifyAccount json
verifyAccount.namespace string 命名空间(直接指定ID或LDAP用户不用填写)
不得为空字符串 :
verifyAccount.identifierType enum 标识符类型(登录账号ID/手机号/邮箱/用户名/LDAP用户)
为以下其中之一 :
 "id",
 "mobile",
 "email",
 "username",
 "ldap",
 "ldap.username"
verifyAccount.identifier string 标识符(与标识符类型对应,即具体的登录账号ID/手机号/邮箱/用户名/LDAP用户)
verifyAccount.password string 密码(指定此字段时会验证密码)
允许为Null :
不得为空字符串 :
verifyAccount.signInTeamId string 登录团队ID(指定此字段时会验证是否属于指定团队)
允许为Null :
直接创建认证令牌

  /api/v1/core-stone-auth/auth-tokens/do/create

/api/v1/core-stone-auth/auth-tokens/do/create


描述

创建认证令牌时,命名空间namespace应由业务系统指定。如前端直接传递,业务系统也应做相应检查。

以ID或验证LDAP用户时,命名空间namespace无需填写。

LDAP登录

指定标识符类型identifierType"ldap"即为LDAP登录。

登录LDAP用户时,标识符identifier必须以"<团队标示/LDAP用户名>"格式传递,如:"jiagouyun/zhang3"

注意:LDAP登录默认根据uid进行处理,如果希望以username登录,请选择"ldap.username"

第一次登录成功后,CoreStone会自动创建一个命名空间为"ldap.<团队唯一标示>"的登录账号。(驻云1号团队为"ldap.jiagouyun"

注意:LDAP用户在登录时,会自动在本系统中添加/更新LDAP用户信息

注意:LDAP用户在登录时,密码password为必填项

请求体

字段 类型 描述 测试
createAuthToken json
createAuthToken.namespace string 命名空间(直接指定ID或LDAP用户不用填写)
不得为空字符串 :
createAuthToken.identifierType enum 标识符类型(登录账号ID/手机号/邮箱/用户名/LDAP用户)
为以下其中之一 :
 "id",
 "mobile",
 "email",
 "username",
 "ldap",
 "ldap.username"
createAuthToken.identifier string 标识符(与标识符类型对应,即具体的登录账号ID/手机号/邮箱/用户名/LDAP uid)
createAuthToken.marker string 认证令牌标记(用于后续批量作废时使用。如区分移动端/Web端产生的认证令牌分别标记为mobile/web)
允许为Null :
createAuthToken.userAgent string 客户端原始User-Agent(指定此字段时,后续验证认证令牌时会要求User-Agent不发生改变,否则抛出错误)
允许为Null :
createAuthToken.password string 密码(指定此字段时会验证密码)
允许为Null :
不得为空字符串 :
createAuthToken.expire integer 认证令牌过期时间(秒,1分钟~1年,默认7天)【拼写错误,请尽早改为"expires"】
允许为Null :
最小值为 : 60
最大值为 : 31536000
createAuthToken.expires integer 认证令牌过期时间(秒,1分钟~1年,默认7天)
允许为Null :
最小值为 : 60
最大值为 : 31536000
createAuthToken.signInTeamId string 登录团队ID(不传递时登录默认团队)
允许为Null :
作废认证令牌(对应客户端登出操作)

  /api/v1/core-stone-auth/auth-tokens/do/revoke

/api/v1/core-stone-auth/auth-tokens/do/revoke


描述

指定认证令牌方式(tokentokenId

序号 认证令牌 认证令牌ID 影响范围 说明
1 指定 作废指定认证令牌 仅作废指定认证令牌
2 指定 作废指定认证令牌ID令牌 仅作废指定认证令牌ID的令牌
3 指定 指定 与【1】相同 同时指定认证令牌认证令牌ID时,认证令牌ID不起作用

指定业务字段方式(teamIdaccountIdmarker

序号 团队ID 登录账号ID 认证令牌标记 影响范围 说明
1 指定 指定 作废指定团队+登录账号的所有认证令牌 可用于类似「多团队登出某团队」的场景
2 指定 作废指定登录账号相关的所有认证令牌 作废指定用户的所有令牌
3 指定 指定 作废指定登录账号+标记的所有认证令牌 可用于类似「仅允许单个手机登录」的场景
4 指定 指定 指定 作废指定团队+登录账号+标记的所有认证令牌 可用于类似「仅允许单个手机登录」的场景

注意:未列在上述表格中的参数组合方式均不予支持,接口直接报错

注意:当认证令牌认证令牌ID指定后,其他传递的参数不起作用

请求体

字段 类型 描述 测试
revokeAuthToken json
revokeAuthToken.token string 认证令牌(优先级高于认证令牌ID、业务字段)
revokeAuthToken.tokenId string 认证令牌ID(优先级高于业务字段)
revokeAuthToken.teamId string 团队ID
revokeAuthToken.accountId string 登录账号ID
revokeAuthToken.marker string 认证令牌标记
解析认证令牌(方便测试/DEBUG使用)

  /api/v1/core-stone-auth/do/inspect

/api/v1/core-stone-auth/do/inspect


Query参数

字段 类型 描述 测试
xCoreStoneAuthToken string 认证令牌
列出团队

  /api/v1/teams/do/list

/api/v1/teams/do/list


Query参数

字段 类型 描述 测试
_fuzzySearch string 模糊搜索
查询字段 :
 "team.name",
 "team.uniqueMarker",
 "team.email",
 "team.telephone",
 "team.mobile",
 "team.industry",
 "team.country",
 "team.province",
 "team.city",
 "team.district",
 "team.address",
 "team.zip"
id commaArray 根据ID过滤
查询方式 : 多值匹配(IN)
查询字段 : team.id
accountId commaArray 根据登录账号(创始人)ID过滤(备注字段,无实际业务逻辑)
查询方式 : 多值匹配(IN)
查询字段 : team.accountId
type commaArray 根据类型过滤
查询方式 : 多值匹配(IN)
查询字段 : team.type
包含以下元素的逗号分隔数组 :
 "singleAccount",
 "multiAccount"
name string 根据名称搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.name
uniqueMarker string 根据标示搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.uniqueMarker
email string 根据邮箱搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.email
telephone string 根据固定电话搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.telephone
mobile string 根据手机号搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.mobile
industry string 根据行业搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.industry
country string 根据国家搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.country
province string 根据省份搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.province
city string 根据城市搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.city
district string 根据区域搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.district
address string 根据地址搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.address
zip string 根据邮编搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.zip
status commaArray 根据状态过滤(预留字段,暂时无用)
查询方式 : 多值匹配(IN)
查询字段 : team.status
包含以下元素的逗号分隔数组 :
 "normal"
isCanceled boolean 根据是否已注销过滤
查询方式 : 等于(=)
查询字段 : team.isCanceled
isDisabled boolean 根据是否已禁用过滤
查询方式 : 等于(=)
查询字段 : team.isDisabled
export enum 导出文件类型
为以下其中之一 :
 "json",
 "csv"
charset enum 导出文件编码
为以下其中之一 :
 "utf8",
 "gbk"
pageSize integer 每页记录数
必须为正整数 :
最小值为 : 1
最大值为 : 100
pageNumber integer 页号
必须为正整数 :
最小值为 : 1
最大值为 : 99999
fieldPicking commaArray 挑选返回字段
fieldKicking commaArray 剔除返回字段
团队详情

  /api/v1/teams/:id/do/get

/api/v1/teams/:id/do/get


Param参数

字段 类型 描述 测试
id string 团队ID

Query参数

字段 类型 描述 测试
fieldPicking commaArray 挑选返回字段
fieldKicking commaArray 剔除返回字段
添加团队

  /api/v1/teams/do/add

/api/v1/teams/do/add


请求体

字段 类型 描述 测试
data json
data.accountId string 登录账号(创始人)ID(备注字段,无实际业务逻辑,团队创建后无法修改)
允许为Null :
data.type enum 类型(只能创建多用户团队)
为以下其中之一 :
 "multiAccount"
data.name string 名称
不得为空字符串 :
data.email string 邮箱
允许为Null :
必须为有效邮箱地址 :
data.telephone string 固定电话
允许为Null :
data.mobile string 手机号
允许为Null :
data.industry string 行业
允许为Null :
data.country string 国家
允许为Null :
data.province string 省份/直辖市
允许为Null :
data.city string 城市
允许为Null :
data.district string 区域
允许为Null :
data.address string 地址
允许为Null :
data.zip string 邮编
允许为Null :
data.status enum 状态(预留字段,暂时无用)
为以下其中之一 :
 "normal"
data.note string 备注
允许为Null :
data.tags json 标签
允许为Null :
accounts array 创建同时添加登录账号
accounts[#] json
accounts[#].id string 登录账号(成员)ID
accounts[#].isDefault boolean 是否为默认团队(设置为`true`时,此登录账号的默认登录团队会切换为本团队)
accounts[#].isAdmin boolean 是否为管理员
accounts[#].inTeamNote string 团队内备注
修改团队

  /api/v1/teams/:id/do/modify

/api/v1/teams/:id/do/modify


Param参数

字段 类型 描述 测试
id string 团队ID

请求体

字段 类型 描述 测试
data json
data.type enum 类型(只能修改为多用户团队)
为以下其中之一 :
 "multiAccount"
data.name string 名称
不得为空字符串 :
data.email string 邮箱
允许为Null :
必须为有效邮箱地址 :
data.telephone string 固定电话
允许为Null :
data.mobile string 手机号
允许为Null :
data.industry string 行业
允许为Null :
data.country string 国家
允许为Null :
data.province string 省份/直辖市
允许为Null :
data.city string 城市
允许为Null :
data.district string 区域
允许为Null :
data.address string 地址
允许为Null :
data.zip string 邮编
允许为Null :
data.status enum 状态(预留字段,暂时无用)
为以下其中之一 :
 "normal"
data.isCanceled boolean 是否为已注销(注销后无法恢复)
值必须为 :
data.isDisabled boolean 是否为已禁用
data.note string 备注
允许为Null :
data.tags json 标签
允许为Null :
列出团队下属登录账号

  /api/v1/teams/:id/accounts/do/list

/api/v1/teams/:id/accounts/do/list


Param参数

字段 类型 描述 测试
id string 团队ID

Query参数

字段 类型 描述 测试
_fuzzySearch string 模糊搜索
查询字段 :
 "acnt.namespace",
 "acnt.email",
 "acnt.mobile",
 "acnt.username",
 "acnt.name",
 "acnt.nickname"
id commaArray 根据ID过滤
查询方式 : 多值匹配(IN)
查询字段 : acnt.id
namespace string 根据命名空间通配
查询方式 : 满足通配
查询字段 : acnt.namespace
email string 根据邮箱过滤
查询方式 : 等于(=)
查询字段 : acnt.email
mobile string 根据手机号过滤
查询方式 : 等于(=)
查询字段 : acnt.mobile
username string 根据用户名过滤
查询方式 : 等于(=)
查询字段 : acnt.username
name string 根据名称搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : acnt.name
nickname string 根据昵称搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : acnt.nickname
isDisabled boolean 根据是否已禁用过滤
查询方式 : 等于(=)
查询字段 : acnt.isDisabled
isDefault boolean 根据是否为默认团队过滤
查询方式 : 等于(=)
查询字段 : rel.isDefault
isAdmin boolean 根据是否为管理员过滤
查询方式 : 等于(=)
查询字段 : rel.isAdmin
export enum 导出文件类型
为以下其中之一 :
 "json",
 "csv"
charset enum 导出文件编码
为以下其中之一 :
 "utf8",
 "gbk"
fieldPicking commaArray 挑选返回字段
fieldKicking commaArray 剔除返回字段
查询团队下属LDAP用户

  /api/v1/teams/:uniqueMarker/ldap-users/do/search

/api/v1/teams/:uniqueMarker/ldap-users/do/search


Param参数

字段 类型 描述 测试
uniqueMarker string 团队唯一标识符

Query参数

字段 类型 描述 测试
uid string 根据LDAP UID搜索(前后匹配)
export enum 导出文件类型
为以下其中之一 :
 "json",
 "csv"
charset enum 导出文件编码
为以下其中之一 :
 "utf8",
 "gbk"
查询团队下属LDAP用户

  /api/v1/teams/ldap-users/do/search

/api/v1/teams/ldap-users/do/search


Query参数

字段 类型 描述 测试
uniqueMarker string 团队唯一标识符
uid string 根据LDAP uid 搜索(前后匹配)
cn string 根据LDAP cn 搜索(前后匹配)
name string 根据LDAP name 搜索(前后匹配)
username string 根据LDAP username 搜索(前后匹配)
phone string 根据LDAP phone 搜索(前后匹配)
objectclass string 根据LDAP objectclass 过滤(完全匹配)
export enum 导出文件类型
为以下其中之一 :
 "json",
 "csv"
charset enum 导出文件编码
为以下其中之一 :
 "utf8",
 "gbk"
向团队添加登录账号

  /api/v1/teams/:id/accounts/do/add

/api/v1/teams/:id/accounts/do/add


Param参数

字段 类型 描述 测试
id string 团队ID

请求体

字段 类型 描述 测试
accounts array
最小长度为 : 1
accounts[#] json
accounts[#].id string 登录账号(成员)ID
accounts[#].isDefault boolean 是否为默认团队(设置为`true`时,此登录账号的默认登录团队会切换为本团队)
值必须为 :
accounts[#].isAdmin boolean 是否为管理员
accounts[#].inTeamNote string 团队内备注
accounts[#].teamRoles array 设置团队角色
accounts[#].teamRoles[#] json
accounts[#].teamRoles[#].id string 团队角色ID
accounts[#].teamRoles[#].operation enum 执行操作
为以下其中之一 :
 "add"
accounts[#].permissions array 设置权限
accounts[#].permissions[#] json
accounts[#].permissions[#].id string 权限ID
accounts[#].permissions[#].operation enum 执行操作
为以下其中之一 :
 "add"
修改团队中登录账号

  /api/v1/teams/:id/accounts/do/modify

/api/v1/teams/:id/accounts/do/modify


Param参数

字段 类型 描述 测试
id string 团队ID

请求体

字段 类型 描述 测试
accounts array
最小长度为 : 1
accounts[#] json
accounts[#].id string 登录账号(成员)ID
accounts[#].isDefault boolean 是否为默认团队(设置为`true`时,此登录账号的默认登录团队会切换为本团队)
值必须为 :
accounts[#].isAdmin boolean 是否为管理员
accounts[#].inTeamNote string 团队内备注
accounts[#].teamRoles array 设置团队角色
accounts[#].teamRoles[#] json
accounts[#].teamRoles[#].id string 团队角色ID
accounts[#].teamRoles[#].operation enum 执行操作
为以下其中之一 :
 "add",
 "remove"
accounts[#].permissions array 设置权限
accounts[#].permissions[#] json
accounts[#].permissions[#].id string 权限ID
accounts[#].permissions[#].operation enum 执行操作
为以下其中之一 :
 "add",
 "remove"
从团队中删除登录账号

  /api/v1/teams/:id/accounts/do/delete

/api/v1/teams/:id/accounts/do/delete


Param参数

字段 类型 描述 测试
id string 团队ID

请求体

字段 类型 描述 测试
accounts array
最小长度为 : 1
accounts[#] json
accounts[#].id string 登录账号(成员)ID
列出登录账号

  /api/v1/accounts/do/list

/api/v1/accounts/do/list


Query参数

字段 类型 描述 测试
_fuzzySearch string 模糊搜索
查询字段 :
 "acnt.namespace",
 "acnt.email",
 "acnt.mobile",
 "acnt.username",
 "acnt.name",
 "acnt.nickname"
id commaArray 根据ID过滤
查询方式 : 多值匹配(IN)
查询字段 : acnt.id
namespace string 根据命名空间通配
查询方式 : 满足通配
查询字段 : acnt.namespace
name string 根据名称搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : acnt.name
nickname string 根据昵称搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : acnt.nickname
email string 根据邮箱过滤
查询方式 : 等于(=)
查询字段 : acnt.email
mobile string 根据手机号过滤
查询方式 : 等于(=)
查询字段 : acnt.mobile
username string 根据用户名过滤
查询方式 : 等于(=)
查询字段 : acnt.username
isDisabled boolean 根据是否为禁用过滤
查询方式 : 等于(=)
查询字段 : acnt.isDisabled
export enum 导出文件类型
为以下其中之一 :
 "json",
 "csv"
charset enum 导出文件编码
为以下其中之一 :
 "utf8",
 "gbk"
pageSize integer 每页记录数
必须为正整数 :
最小值为 : 1
最大值为 : 100
pageNumber integer 页号
必须为正整数 :
最小值为 : 1
最大值为 : 99999
fieldPicking commaArray 挑选返回字段
fieldKicking commaArray 剔除返回字段
登录账号详情

  /api/v1/accounts/:id/do/get

/api/v1/accounts/:id/do/get


Param参数

字段 类型 描述 测试
id string 登录账号ID

Query参数

字段 类型 描述 测试
fieldPicking commaArray 挑选返回字段
fieldKicking commaArray 剔除返回字段
添加登录账号

  /api/v1/accounts/do/add

/api/v1/accounts/do/add


请求体

字段 类型 描述 测试
data json
data.namespace string 命名空间
不得为空字符串 :
值不得为 : ldap
不得满足正则表达式 : ^ldap\.
必须满足正则表达式 : ^\w([.\w-]*\w)?$
data.name string 名称(操作人姓名)
不得为空字符串 :
data.nickname string 昵称
允许为Null :
data.password string 密码
允许为Null :
不得为空字符串 :
data.email string 邮箱(可用于登录)
允许为Null :
必须为有效邮箱地址 :
data.mobile string 手机号(可用于登录)
允许为Null :
data.username string 用户名(可用于登录)
允许为Null :
data.status enum 状态(预留字段,暂时无用)
为以下其中之一 :
 "normal"
data.tags json 标签
允许为Null :
teams array 创建同时添加至团队
teams[#] json
teams[#].id string 团队ID
teams[#].isDefault boolean 是否为默认团队
teams[#].isAdmin boolean 是否为管理员
teams[#].inTeamNote string 团队内备注
修改登录账号

  /api/v1/accounts/:id/do/modify

/api/v1/accounts/:id/do/modify


Param参数

字段 类型 描述 测试
id string 登录账号ID

请求体

字段 类型 描述 测试
data json
data.namespace string 命名空间
不得为空字符串 :
值不得为 : ldap
不得满足正则表达式 : ^ldap\.
必须满足正则表达式 : ^\w([.\w-]*\w)?$
data.name string 名称(操作人姓名)
不得为空字符串 :
data.nickname string 昵称
允许为Null :
data.password string 密码(直接修改密码)
不得为空字符串 :
data.email string 邮箱(可用于登录)
允许为Null :
必须为有效邮箱地址 :
data.mobile string 手机号(可用于登录)
允许为Null :
data.username string 用户名(可用于登录)
允许为Null :
data.status enum 状态(预留字段,暂时无用)
为以下其中之一 :
 "normal"
data.isDisabled boolean 是否为已禁用
data.tags json 标签
允许为Null :
列出登录账号加入的团队

  /api/v1/account/:id/teams/do/list

/api/v1/account/:id/teams/do/list


Param参数

字段 类型 描述 测试
id string 登录账号ID

Query参数

字段 类型 描述 测试
_fuzzySearch string 模糊搜索
查询字段 :
 "team.name",
 "team.uniqueMarker",
 "team.email",
 "team.telephone",
 "team.mobile",
 "team.industry",
 "team.country",
 "team.province",
 "team.city",
 "team.district",
 "team.address",
 "team.zip"
id commaArray 根据ID过滤
查询方式 : 多值匹配(IN)
查询字段 : team.id
accountId commaArray 根据登录账号(创始人)ID过滤(备注字段,无实际业务逻辑)
查询方式 : 多值匹配(IN)
查询字段 : team.accountId
type commaArray 根据类型过滤
查询方式 : 多值匹配(IN)
查询字段 : team.type
包含以下元素的逗号分隔数组 :
 "singleAccount",
 "multiAccount"
name string 根据名称搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.name
uniqueMarker string 根据标示搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.uniqueMarker
email string 根据邮箱搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.email
telephone string 根据固定电话搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.telephone
mobile string 根据手机号搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.mobile
industry string 根据行业搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.industry
country string 根据国家搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.country
province string 根据省份搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.province
city string 根据城市搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.city
district string 根据区域搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.district
address string 根据地址搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.address
zip string 根据邮编搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : team.zip
status commaArray 根据状态过滤(预留字段,暂时无用)
查询方式 : 多值匹配(IN)
查询字段 : team.status
包含以下元素的逗号分隔数组 :
 "normal"
isDisabled boolean 根据是否已禁用过滤
查询方式 : 等于(=)
查询字段 : team.isDisabled
isDefault boolean 根据是否为默认团队过滤
查询方式 : 等于(=)
查询字段 : rel.isDefault
isAdmin boolean 根据是否为管理员过滤
查询方式 : 等于(=)
查询字段 : rel.isAdmin
export enum 导出文件类型
为以下其中之一 :
 "json",
 "csv"
charset enum 导出文件编码
为以下其中之一 :
 "utf8",
 "gbk"
fieldPicking commaArray 挑选返回字段
fieldKicking commaArray 剔除返回字段
设置默认团队

  /api/v1/accounts/:id/do/switch-default-team

/api/v1/accounts/:id/do/switch-default-team


Param参数

字段 类型 描述 测试
id string 登录账号ID

请求体

字段 类型 描述 测试
defaultTeam json
defaultTeam.id string 新默认团队ID
业务系统健康状态

  /api/v1/biz-system-health/do/list

/api/v1/biz-system-health/do/list


描述

返回值示例如下:

{
  "error"  : 200,
  "message": "",
  "data": [
    {
      "id"                      : "<业务系统ID>",
      "name"                    : "<业务系统名称>",
      "dispatchStatus"          : "Error", // 转发状态:"OK"=转发正常, "Error"=转发失败
      "hasResponseErrorRecently": true     // 最近存在响应错误:true=是,false=否
    },
    ...
  ]
}
列出团队角色

  /api/v1/team-roles/do/list

/api/v1/team-roles/do/list


Query参数

字段 类型 描述 测试
_fuzzySearch string 模糊搜索
查询字段 :
 "tmro.name"
_limitTeamId string 限制目标数据所属团队ID
id commaArray 根据ID过滤
查询方式 : 多值匹配(IN)
查询字段 : tmro.id
teamId string 根据团队ID过滤
查询方式 : 等于或为NULL
查询字段 : tmro.teamId
name string 根据名称搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : tmro.name
export enum 导出文件类型
为以下其中之一 :
 "json",
 "csv"
charset enum 导出文件编码
为以下其中之一 :
 "utf8",
 "gbk"
fieldPicking commaArray 挑选返回字段
fieldKicking commaArray 剔除返回字段
添加团队角色

  /api/v1/team-roles/do/add

/api/v1/team-roles/do/add


请求体

字段 类型 描述 测试
data json
data.teamId string 团队ID
data.name string 名称
permissions array 设置权限
permissions[#] json
permissions[#].id string 权限ID
permissions[#].operation enum 执行操作
为以下其中之一 :
 "add"
修改团队角色

  /api/v1/team-roles/:id/do/modify

/api/v1/team-roles/:id/do/modify


Param参数

字段 类型 描述 测试
id string 团队角色ID

Query参数

字段 类型 描述 测试
_limitTeamId string 限制目标数据所属团队ID

请求体

字段 类型 描述 测试
data json
data.name string 名称
permissions array 设置权限
permissions[#] json
permissions[#].id string 权限ID
permissions[#].operation enum 执行操作
为以下其中之一 :
 "add",
 "remove"
删除团队角色

  /api/v1/team-roles/:id/do/delete

/api/v1/team-roles/:id/do/delete


Param参数

字段 类型 描述 测试
id string 团队角色ID

Query参数

字段 类型 描述 测试
_limitTeamId string 限制目标数据所属团队ID
列出权限

  /api/v1/permissions/do/list

/api/v1/permissions/do/list


Query参数

字段 类型 描述 测试
_fuzzySearch string 模糊搜索
查询字段 :
 "perm.id",
 "perm.name"
id commaArray 根据权限ID(代码)过滤
查询方式 : 多值匹配(IN)
查询字段 : perm.id
name string 根据名称搜索
查询方式 : 包含(LIKE '%value%')
查询字段 : perm.name
export enum 导出文件类型
为以下其中之一 :
 "json",
 "csv"
charset enum 导出文件编码
为以下其中之一 :
 "utf8",
 "gbk"
pageSize integer 每页记录数
必须为正整数 :
最小值为 : 1
最大值为 : 100
pageNumber integer 页号
必须为正整数 :
最小值为 : 1
最大值为 : 99999
fieldPicking commaArray 挑选返回字段
fieldKicking commaArray 剔除返回字段