1. 访问业务数据管理微服务
如果想访问业务数据管理微服务,可以使用以下格式的 url:
其中{service}表示小写的微服务 id,{appKey} 表示应用标识,在后台中占用一个独立的 DB。微服务 id 清单如下:
业务接口分类 | 微服务id |
---|---|
系统管理 | bospersonnelservice |
通用数据管理 | bosfoundationservice |
文档管理 | bosdocumentservice |
设备/物项管理 | bosdesignservice |
进度管理 | bosprogressservice |
appKey 为 BOS 应用实例的 Key,一个 BOS 应用实例对应一个唯一 Key。应用在 BOS 中创建后、发布后都将获得对应的 appKey。BOS 中创建后的应用的 appKey 可在「 应用管理 -编辑」获取,BOS 应用发布后可在用户中心或管理员中心应用管理界面获得。
比如想在BOS中调用「某个应用的文档管理微服务的创建文件夹接口」,可使用:
http://bosgw.bimwinner.com/bosdocumentservice/h5e4ff8257dc4e86a8042097f67d2718/folders
2. 数据访问控制
2.1. AccessToken
BOS 应用请求API时,系统使用 AccessToken 进行数据访问控制。
AccessToken:BOS 应用请求的访问标识。用户登录后可获得 AccessToken。
AccessToken 可通过以下2种方式传递:
HTTP Header(HTTP请求头):Authorization:xxxxxxxx
URL参数:access_token=xxxxxxxx
AccessToken 有一定的有效期,固定时长(6h)。当 AccessToken 过期时,需要使用更新后的 AccessToken。获取 AccessToken 的方式为:
BOS应用: 调用 应用登录 接口。
2.2. 权限控制
应用创建者拥有对数据模型配置的权限,其他用户没有。
可访问应用的用户默认可以创建数据。
如果应用启用 gacl 数据级权限管理模式,则应用中的实例数据,除了数据创建者外,其他用户只有被授权才可以访问和操作。如果应用未启用 gacl 数据级权限管理模式,则应用中的实例数据被访问或操作时不用校验用户权限。
如果应用启用 gacl 数据级权限管理模式,默认全部对象类都启用数据级权限管理;如果创建对象类的时候指定不启用数据级权限管理,则该对象类的实例数据被调用时不用校验用户权限。
3. 重要业务流程
3.1. API请求参数格式
API请求参数以 Headers、Search Parameters、Path Parameters 和 Body(适用于POST、PUT、复杂的GET)等形式传递:
Headers:主要包含 Authorization、Content-Type 等HTTP头部信息。
Search Parameters:查询参数,url中的参数。例如:http://x.xx.xx/xx?key=1 中的 key 属于 Search Parameter。
Path Parameters:路径参数,url 中的路径参数,例如:http://x.xx.xx/xxx/{key} 中的 key 属于 Path Parameter。
Body:对于对象型数据,body 格式为{"参数名":"参数值",……};对于列表型数据,body 格式为[{},{}]。
3.2. API返回数据格式
3.2.1. HTTP Status Code(HTTP状态码)
HTTP Status 200 -> 服务器已成功处理了请求
HTTP Status 400 -> 服务器不理解请求的语法
HTTP Status 401 -> 请求要求身份验证
HTTP Status 403 -> 服务器拒绝请求
HTTP Status 404 -> 服务器找不到请求的资源
HTTP Status 405 -> 禁用请求中指定的方法
HTTP Status 406 -> 无法使用请求的内容特性响应请求的资源
HTTP Status 407 -> 未授权,但指定请求者应当授权使用代理(需要代理授权)
HTTP Status 408 -> 服务器等候请求时发生超时
HTTP Status 409 -> 服务器在完成请求时发生冲突
HTTP Status 410 -> 请求的资源已永久删除
HTTP Status 411 -> 服务器不接受不含有效内容长度标头字段的请求
HTTP Status 412 -> 服务器未满足请求者在请求中设置的其中一个前提条件
HTTP Status 413 -> 请求实体过大,超出服务器的处理能力,服务器无法处理
HTTP Status 414 -> 请求的 URI(通常为网址)过长,服务器无法处理
HTTP Status 415 -> 请求的格式不受请求页面的支持
HTTP Status 416 -> 如果页面无法提供请求的范围,则服务器会返回此状态代码
HTTP Status 417 -> 服务器未满足"期望"请求标头字段的要求
HTTP Status 423 -> 资源已锁定
HTTP Status 500 -> 服务器遇到错误,无法完成请求
HTTP Status 501 -> 服务器不具备完成请求的功能
HTTP Status 502 -> 服务器作为网关或代理,从上游服务器收到无效响应
HTTP Status 503 -> 服务器目前无法使用(由于超载或停机维护)
HTTP Status 504 -> 服务器作为网关或代理,但是没有及时从上游服务器收到请求
HTTP Status 505 -> 服务器不支持请求中所用的 HTTP 协议版本
注:除非特殊指明,接口响应代码均为200
3.2.2. HTTP Body(HTTP消息主体)
- 通常情况下,API 响应消息主体格式如下:
{
"code": "xxx",
"message": "xxxxx",
"data": "xxx"
}
其中:code 为响应代码,message 为响应消息,data 为响应数据。执行成功的情况下 code 值为 SUCCESS,执行出错的情况 code 值请参考下面表格。
对于对象型数据,data 格式为{};对于列表型数据,data 格式为[{},{}];data 也可以为 null。
特殊情况:当下载文件时,HTTP body 为特定格式的文件。
- 对于对象型数据,data 格式为:
{
//content
}
{
"key": "3a0f185b7cbd4fb49d587aeba1c4b43a",
"bosclass": "folders",
"code": "folder1",
"name": "样例目录",
"isRoot": "true",
"description": ""
}
- 对于列表型数据,data格式为:
[
{#content1},
{#content2}
]
例如,http://bosgw.bimwinner.com/bosdocumentservice/xb05cd3a35614caa85c0f8f86c58fcc1/folders 的返回数据体为:
[
{
"key": "3a0f185b7cbd4fb49d587aeba1c4b43a",
"bosclass": "folders",
"code": "folder1",
"name": "样例目录1",
"isRoot": "true",
"description": ""
},
{
"key": "3a0f185b7cbd4fb59d587aeba1c4b43a",
"bosclass": "folders",
"code": "folder2",
"name": "样例目录2",
"isRoot": "true",
"description": ""
}
]
3.3. 错误响应
系统采用统一的错误异常响应,响应的消息主体格式如下:
{
"code": "xxx",
"message": "xxxxx",
"data": NULL
}
具体错误返回清单如下:
HTTP Status code | code值 | message值 | 含义 |
---|---|---|---|
404 | 调用的接口不存在 | ||
405 | 使用错误的Method调用接口时(比如使用DELETE调用一个POST接口) | ||
423 | ACCOUNT_SUBSCRIBE_EXPIRE | 订阅账号已到期 | 体验或订阅过期后,资源锁定 |
500 | 服务器内部错误 | ||
200 | SUCCESS | 请求处理成功 | 执行成功 |
200 | JSON_FORMAT_WRONG | Json格式错误 | Json格式错误 |
200 | OBJECT_REQUIREDFIELD_EMPTY | XXX属性必填 | 实体/关系/层次对象必填字段缺失 |
200 | OBJECT_FIELD_DATATYPE_WRONG | XXX属性数据类型错误 | 实体/关系/层次对象字段数据类型错误 |
200 | OBJECT_FIELD_DATA_WRONG | XXX属性数据错误 | 实体/关系/层次对象字段数据错误 |
200 | BOSCLASS_NA | 不适用于{bosclass}类型实例数据 | 实体/关系/层次对象类不适用当前接口 |
200 | ENTITY_BOSCLASS_NOTFOUND | 实体类{bosclass}不存在 | 实体对象类不存在 |
200 | RELATIONSHIP_BOSCLASS_NOTFOUND | 关系类{bosclass}不存在 | 关系对象类不存在 |
200 | ENTITY_NOTFOUND | Key为{key}的{bosclass}实体对象 | 实体对象不存在 |
200 | RELATIONSHIP_NOTFOUND | Key为{key}的{bosclass}关系对象不存在 | 关系对象不存在 |
200 | RELATIONSHIP_BYFROMTO_NOTFOUND | 左对象为{bosclass/key}、右对象为{bosclass/key}的关系对象不存在 | 关系对象不存在 |
200 | ENTITY_CODE_EXIST | 系统中已存在编码为xxx的{bosclass} | 数据库表中实体code重复 |
200 | ENTITY_CODE_REVISION_EXIST | 系统中已存在编码为xxx、版本为yyy的{bosclass} | 数据库表中实体code+revision重复 |
200 | ENTITY_READPERMISSION_REQUIRED | 缺少实体对象{bosclass/key}的读权限 | 缺乏对实体对象读权限 |
200 | ENTITY_WRITEPERMISSION_REQUIRED | 缺少实体对象{bosclass/key}的写权限 | 缺乏对实体对象写权限 |
200 | ENTITY_DELETEPERMISSION_REQUIRED | 缺少实体对象{bosclass/key}的删除权限 | 缺乏对实体对象删除权限 |
200 | ENTITY_CONTROLPERMISSION_REQUIRED | 缺少实体对象{bosclass/key}的控制 | 缺乏对实体对象控制权限 |
200 | USER_ADMINPERMISSION_REQUIRED | 当前用户非用户管理员 | 缺乏用户管理员权限 |
200 | ENTITY_RELATIONSHIP_EXIST | 实体对象{bosclass/key}存在关联关系 | 实体对象存在关联关系 |
200 | RELATIONSHIP_RELATIONENTITY_PERMISSION_INSUFFICIENT | 缺少对关联实体对象{bosclass/key}的读权限 | 缺少关联实体对象的读权限 |
200 | ENTITYKEY_FORMAT_WRONG | 实体对象{bosclass/key}格式错误 | 实体对象描述格式错误 |
200 | RELATIONSHIP_RELATIONENTITY_NOTFOUND | Key为{key}的{bosclass}关联实体对象不存在 | 关联对象不存在 |
200 | RELATIONSHIP_RELATIONENTITY_SAME | 左右关联对象{bosclass/key}相同 | 关联左右实体对象相同 |
200 | RELATIONSHIP_RELATIONENTITY_DATATYPE_WRONG | 关联左/右对象{bosclass/key}数据类型错误 | 关联左右实体对象数据类型错误 |
200 | RELATIONSHIP_BOSCLASS_WRONG | 关系类名称错误 | 适用于通过关系类和左右对象定位关系实例数据的接口,左右对象的关系存在,但bosclass不对 |
200 | RELATIONSHIP_BOSCLASS_CANNT_MODIFY | 关系类bosclass不可修改 | NULL |
200 | RELATIONSHIP_FROM_CANNT_MODIFY | 关系类左对象不可修改 | NULL |
200 | RELATIONSHIP_TO_CANNT_MODIFY | 关系类右对象不可修改 | NULL |
200 | RELATIONSHIP_EXIST | 已存在左对象为{bosclass/key}、右对象为{bosclass/key}的关系对象 | 数据库表中已存在相同左右关联对象的关系数据 |
200 | RELATIONSHIP_DEFINITION_WRONG | relationKey,relationClass,relationKeyType内容不符合建立关联关系要求 | 创建实体同时创建关联关系时,关系描述内容不符合关联要求 |
200 | RELATIONSHIP_DEFINITION_INCOMPLETE | relationKey,relationClass,relationKeyType必须全部指定或全部不指定 | 创建实体同时创建关联关系时,定义关系 |
200 | RELATIONSHIP_RELATIONPARAMETER_REQUIREDFIELD_EMPTY | relationParameter中xxx属性必填 | 创建实体同时创建关联关系时,relationParameter中必填字段缺失 |
200 | RELATIONSHIP_FIELD_DATATYPE_WRONG | relationKey,relationClass,relationKeyType数据类型错误 | 创建实体同时创建关联关系时,定义关系 |
200 | RELATIONSHIP_RELATIONPARAMETER_DATATYPE_WRONG | relationParameter中xxx属性数据类型错误 | 创建实体同时创建关联关系时,relationParameter参数数据类型错误 |
200 | ENTITY_QUERY_NUMBER_SETTING_CONFLICT | 不可同时设置number为true、operator为非数字运算符{operator} | 查询接口中,参数number值为true,operator值为非数字运算符 |
200 | ENTITY_QUERY_NUMBER_CONVERT_WRONG | value参数值{value }非数字 | 查询接口中,参数number值为true,但value值无法转换为数字 |
200 | ENTITY_QUERY_NUMBER_SETTING_INVALID | number参数值{number}无效 | 查询接口中,参数number值为true、false、空以外的其他值 |
200 | ENTITY_QUERY_LOGIC_SETTING_INVALID | logic参数值{logic}无效 | 查询接口中,参数logic为Or、And以外的值 |
200 | ENTITY_QUERY_PAGE_SETTING_INVALID | page参数值{page}非数字 | 实体查询接口中,查询参数page值为数字以外的值 |
200 | ENTITY_QUERY_PERPAGE_SETTING_INVALID | per_page参数值{per_page}非数字 | 实体查询接口中,查询参数per_page值为数字以外的值 |
200 | ENTITY_QUERY_ORDER_SETTING_INVALID | order参数值{order}无效 | 实体查询接口中,查询参数order值为asc或desc以外的值 |
200 | SEARCHPARAS_VALUE_INVALID | 接口路径搜索参数{serchParas}值无效 | 接口路径搜索参数的参数值无效 |
200 | SERACHPARAS_REQUIRED | 接口路径搜索参数{serchParas}必填 | 接口路径搜索参数的必填参数缺失 |
200 | ENTITY_PERMISSION_LASTCPERMISSION | 不可删除当前用户对{bosclass/key}的最后一个控制权限 | 删除当前用户对实体的最后一个c控制权限 |
200 | FILEIMPORT_XML_FORMAT_WRONG | XML文件格式错误 | XML导入文件格式错误 |
200 | FILEIMPORT_EXCEL_FORMAT_WRONG | EXCEL文件格式错误 | EXCEL导入文件格式错误 |
200 | FILEIMPORT_XML_REQUIRED | 缺少XML文件 | 导入文件缺少XML文件 |
200 | FILEIMPORT_EXCEL_REQUIRED | 缺少EXCEL文件 | 导入文件缺少EXCEL文件 |
200 | FILEIMPORT_XML_PROCESS_REQUIRED | XML文件未配置Process节点 | XML导入配置缺少Process节点或Process节点没有子节点 |
200 | FILEIMPORT_XML_PROCESS_ATTRIBUTE_REQUIRED | XML文件未配置Process节点属性 | XML导入配置中Process节点没有配置属性 |
200 | FILEIMPORT_XML_ROW_REQUIRED | XML文件未配置Row节点 | XML导入配置缺少Row节点 |
200 | FILEIMPORT_EXCEL_CONFIG_REQUIRD | EXCEL文件中未配置导入对象 | 单Excel文件导入时Excel中没有配置导入类模板或模板中没有配置导入属性 |
200 | FILEIMPORT_EXCEL_DATAINFO_REQUIRD | EXCEL文件中未配置DataInfo导入数据 | 单Excel文件导入时Excel中没有配置DataInfo页或DataInfo页上没有导入数据 |
200 | FILEIMPORT_EXCEL_DATATYPE_WRONG | Excel导入数据存在非文本格式 | Excel单元格内容存在非文本格式 |
200 | FILEIMPORT_RECORD_UNSUCCESS | 第【X】行 具体错误信息 | 单条数据导入失败 |
200 | ENTITY_QUERY_RELATIONSHIP_FROMTO_REQUIRD | 关系{bosclass}没有指定from、to左右关联对象 | 多对象查询等类似查询实体与关联关系的接口中,当需要关联关系连接实体对象但又未提供左右关联对象类 |
200 | ENTITY_QUERY_RETURN_ATTRIBUTE_REQUIRED | 需指定返回的属性 | 多对象查询等类似查询实体与关联关系的接口中,当需要指定返回属性但实际未指定时 |
200 | FOLDER_NAME_EXIST | 当前文件夹已存在名称为{name}的子文件夹 | 当前文件夹下存在同名子文件夹 |
200 | FOLDER_SUBFOLDER_EXIST | 当前文件夹下存在子文件夹 | 文件夹下有子文件夹 |
200 | FOLDER_DOCUMENT_EXIST | 当前文件夹下存在文档 | 文件夹下有文档 |
200 | DOCUMENT_NAME_EXIST | 当前文件夹已存在名称为{name}的文档 | 当前文件夹下存在同名文档 |
200 | SHARE_OBJECT_NOTEXIST | 分享包中不存在实体对象{bosclass/key} | 分享包中不存在指定对象 |
200 | MODEL_MODELTYPE_UNSUPPORT | 不是模型解析服务支持的文件类型 | NULL |
200 | MODEL_NOTFOUND | key为{modelkey}的模型不存在 | NULL |
200 | FILEKEY_REQUIRED | 文件key必填 | NULL |
200 | RESULTRECORD_MORE_THAN_ONE | 符合条件的构件数量大于1 | NULL |
200 | TAG_COMPONENT_RELATIONSHIP_NOTFOUND | 无Tag对象与BOS3D构件关联 | NULL |
200 | MODEL_MODELTYPE_UNSUPPORT | 不是模型解析服务支持的文件类型 | NULL |
200 | GACL_NA | 应用未开启gacl授权模式 | NULL |
200 | ENTITY_QUERY_CONDITION_REQUIRED | 需指定查询条件 | NULL |
200 | ENTITY_NAME_INVALID | 实体对象name属性值无效 | NULL |
200 | BODY_PARAMETER_INVALID | 接口Body传参无效 | NULL |
200 | ENTITY_PARENTID_EQUALS_DESCENDANT | 不可将parentId指向其任意下层节点 | NULL |
200 | MODEL_NOT_FOUND | 模型(xxx)不存在 | NULL |
200 | PARSE_NOT_FINISHED | 模型(xxx)尚在解析中 | NULL |
200 | PARSE_FAILED | 模型(xxx)解析失败 | NULL |
200 | DATABASE_NOT_FOUND | 3D库(xxx)不存在 | NULL |
200 | TRANSACTION_CODE_NOT_FOUND | 业务事务编码不存在 | NULL |
200 | TRANSACTION_CODE_EXPIRED | 业务事务编码已过期 | NULL |
200 | DOCUMENT_NOT_LATEST | Key为{key}的文档不是最高版本文档 | NULL |
4. 业务接口设计
4.1. 一般约定
4.1.1. 实体权限管理
gacl 实体权限管理仅适用于在创建时设置了启用数据级权限控制的应用。
gacl 属性标识实体对象类实体的权限信息,其格式如下:
{ "gacl": [ { "type": "A", "flags": "g", "principal": "roles/123", "permissions": "r" }, // 角色权限示例 { "type": "A", "flags": "", "principal": "users/me", "permissions": "rwdc" }, // 用户权限示例 { "type": "A", "flags": "", "principal": "all", "permissions": "rwd" } //所有人权限示例 ], "bosclass": "demo" //其他属性信息 }
其中:
flags:g标识该权限为角色权限,其它为用户权限。
principal:用户、角色名、所有人,值为用户、角色名id(格式为对象类基类类名/对象实体key)、all(代表应用内所有用户)。
permissions:权限字段。r为可读,w为可写,d为可删,c为控制(具有授权权限)。
rwdc 四种权限的约束关系如下:
权限 | 授权方式 |
---|---|
r为可读 | 可单独授权 |
w为可写 | 授权w时,同时授予r权限 |
d为可删 | 授权d时,同时授予rw权限 |
c为控制 | 授权c时,同时授予rwd权限 |
gacl数据级权限判定
权限判定:用户具有的权限为该用户的权限和该用户对应的所有角色权限的并集。
操作对象类数据:获取数据时需具有该数据的读权限(r);修改数据时需需具有该数据的写权限(w);删除数据需需具有该数据的删除权限(d),对数据设置权限时需具有该数据的控制权限(c)。
操作关系类数据 :获取、创建、修改、删除数据时需同时具有关联对象的读权限。关联对象指的是关系实例左右关联的实体对象(即关系实例中_from、_to指向的实体对象)。
当为 all 时,表示所有用户拥有该数据的访问权限,all 只能有 rwd 权限,不能有 c 权限。
4.1.2. 查询条件说明
对于返回多个对象的情况,可在SearchParas上设置查询附加参数,对返回的结果进行属性筛选,下列为查询附加参数说明:
whitelist=xxx,yyy,zzz 指定返回属性字段,多个属性名用英文逗号隔开。
limit=10:指定返回记录的数量,值为正整数。
offset=10:指定返回记录的开始位置,值为正整数。
page=2&per_page=100:page 指定第几页,per_page 指定每页的记录数,值为正整数。page 为 0 或负整数时默认返回第1页。
sortby=name&order=asc:sortby 指定返回结果按照哪个属性排序,order 指定排序顺序(值可为 asc 或 desc ),多个属性用英文逗号隔开(按属性顺序依次进行排序,如第一个属性值相同,则按第二个属性值排序,依次类推)。
具体适用的接口请见每个接口的说明。
4.1.3. GET方法返回对象内容说明
获取某一个实体对象信息时,返回的 body 由参数、关系两部分构成。返回的参数内容由此对象的 bosclass 定义决定,同时包含 gtime、guser、gacl三个内置属性以及 currentUserPermissions 属性(currentUserPermissions 为当前用户(包括用户所属的角色)对该实体的所有权限);返回的关系为与此对象关联的所有一级关系,用户对返回的实体对象、关联关系涉及的另一实体对象需具有读取权限。以 folders 为例返回内容如下:
{ "parameter": { "key": "", "bosclass": "", "code": "", "description": "", "name": "", "gtime": "", "guser": "", "gacl": [ { "principal": "user/187611711", "permissions": "rwdc", "flags": "" } ], "currentUserPermissions": "rwdc" }, "relationship": { "irFolderDocument": { "documents": [ { "key": "document04_0", "uri": " http://xxx.xxx/documents/document04_0", "relationshipKey": "XXX" }, { "key": "document05_0", "uri": " http://xxx.xxx/documents/document05_0", "relationshipKey": "YYY" } ] } } }
说明:当用户通过 SearchParas 的 whitelist 设置对象返回属性时,parameter 部分除了返回 whitelist 中指定的属性外,默认返回key 、gtime、guser、gacl三个内置属性以及 currentUserPermissions 属性。
4.1.4. 关于批量处理数据
所有批量添加、修改、删除接口执行过程中,如遇到数据错误则此条数据不执行,其他正确数据正常执行,并返回执行成功/失败的消息,HTTP状态码为200。当一条数据存在多个错误时,按照校验顺序返回校验发现的第一个错误。
4.1.5. Relationship关系实例数据创建
关联关系实例中,左关联对象实例可为关联关系定义时的左对象类的实例或左对象类的子孙类的实例,右关联对象实例可为关联关系定义时的右对象类的实例或右对象类的子孙类的实例。
4.1.6. 树形结构对象设置
对于启用了树形结构的对象类,系统默认会增加5个属性:parentId、longCode、longName、level、leaf。用户如需在接口中设置对象的树形层次结构,只需传递parentId属性,parentId指向当前对象的父对象成。其中parentId的值为:对象类基类类名/父对象key。
4.1.7. 业务事务控制
对于需要调用多个增删改、授权接口才能实现某个完整业务的事务控制,可通过调用“GET /prototype/transaction启动业务事务” 接口获取事务编码,并在调用增删改、授权接口时传递该业务事务编码(通过SearchParas 中transactionCode参数传递业务事务编码)以表示这些接口的操作处于同一事务中,后续当事务中某个接口执行未按预期时,可通过调用“POST /prototype/transaction/{transactionCode}根据业务事务编码发起事务回滚”接口对处于同一事务中已执行的操作进行回滚,通过事务控制可实现处于同一事务中的接口要么全部执行成功,要么全部不执行。