公共 API 原则
Ops Manager 公共API遵循REST架构原则来公开内部资源,从而提供对 Ops Manager 功能的编程访问。
API 具有以下功能:
- JSON实体
- 所有实体都以 JSON 表示。
- 基于密钥的访问
- 每个需要连接到 Ops Manager 的 Ops Manager 用户或应用程序都必须在访问 Ops Manager API 之前 生成 API 密钥 。
- 摘要式身份验证
- 为确保您的 公共API密钥 永远不会通过网络发送,我们使用 HTTP摘要式身份验证 对 API 请求进行身份验证。
- 可浏览界面
- 使用一致的链接机制,您可以从根资源开始,然后通过相关资源的链接来浏览整个 API。
- 用户访问控制
每个 Ops Manager 用户的API功能与其Ops Manager 角色授予的权限相匹配。
例子
Project Read Only
无论是通过 Ops Manager 用户界面还是 API ,具有 角色的用户都无法修改该项目中的任何资源。- API网络访问列表
Ops Manager API可以通过API 访问列表保护对 Ops Manager Administration API 的访问。此列表将对API的访问限制为特定的IP或CIDR地址。 每个API密钥都有自己的 Ops Manager Administration API 访问列表。 使用 Ops Manager 用户界面创建新组织时,MongoDB Atlas 默认启用API访问列表要求。
要了解更多信息,请参阅(可选)需要组织的 API 访问列表。
HTTP 方法
所有资源都支持这些常见HTTP方法的子集:
方法 | 用途 |
---|---|
| 检索资源的JSON表示形式。 |
| 使用提供的 JSON 表示形式创建新资源。 |
| 将资源替换为提供的JSON表示形式。 |
| 使用提供的JSON表示形式更新资源中的指定字段。 |
| 删除资源。 |
| 检索不带资源的JSON表示形式的响应标头。 |
JSON
所有实体均以JSON表示。 以下请求规则和响应约定适用:
请求规则
- 应用正确的内容类型标头
- 通过
POST
或PUT
向服务器发送JSON时,请确保指定正确的内容类型请求标头:
Content-Type: application/json
- 将日期设置为 ISO8601 字符串
将日期发送到服务器时(作为查询参数或
POST
或PATCH
请求实体中的字段),请使用根据 ISO8601 标准。如果不指定时区域, MongoDB Ops Manager将假定为UTC 。 包括时区域标识符以避免任何歧义。例子
2018 年 9 月 27 日表示为
2018-09-27
。2018 年 9 月 27 日下午 4:00 EDT 用
2018-09-27T16:00-04:00
表示(带区域)。
在某些情况下,时间戳会以 BSON时间戳 的 JSON 表示形式返回 ,尤其是在备份资源方面。这种BSON时间戳表示将JSON文档作为具有两个字段的对象提供:
字段定义date
自 UNIX 纪元以来的秒数
increment
给定秒内操作的递增 32 位整数序数。
例子
第三次操作(美国东部区域 2018 年 9 月 27 日下午 4:00)表示为(带区域)为
{ date: 2018-09-27T16:00-04:00, increment: 3 }
响应约定
- 拒绝无效字段
无效字段会被拒绝,而不是被忽略。
例子
您尝试创建新实体并拼错其中一个字段,或者尝试更新现有实体并包含无法修改的字段,则 Ops Manager 会使用HTTP 400 状态代码进行响应,并显示一条错误消息,说明哪个字段被修改。无效。
- 以 ISO 格式返回日期8601 字符串
- 所有日期均以 ISO8601 格式 返回 - 以 UTC 格式指定的字符串。
- 用于消除单位歧义的标签字段
包含特定单位数值的字段经过命名,以消除所使用单位的歧义。
例子
主机的正常运行时间以毫秒为单位返回,因此主机实体字段的名称是
uptimeMsec
。- 返回没有其他值的字段的默认值
没有当前值的字段将返回适当的默认值。
例子
Ops Manager 没有新发现主机的任何统计信息,因此所有与统计信息相关的字段的值均为零。
将从实体中省略没有合理默认值的字段。
例子
未使用身份验证的主机会省略返回实体中的
username
字段。- 按字母顺序返回字段
- Ops Manager 应用程序返回的JSON文档中的字段按字母顺序排列。订单可能会发生变化。 不要依赖字段的顺序。
链接
每个资源包括一个或多个指向子资源的链接和/或相关资源。
例子
主机具有指向其所属项目、副本集等的链接。
链接放置在实体的links
字段中,该实体是链接关系对象的数组。 每个链接关系都有两个字段:
字段 | 定义 |
---|---|
| 关系的名称(或类型)。 其中许多被视为扩展关系类型,并以 |
| 目标URL 。 |
所有实体都至少包含一个名为self
的链接关系,即实体自己的URL 。 当实体是列表的一部分时(即,请求项目中的所有主机时),它仅包含self
链接关系。
例子
这是包含一些链接的host
资源的一部分:
1 { 2 "rel": "http://mms.mongodb.com/project", 3 "href": "https://cloud.mongodb.com/api/public/v1.0/projects/xxx" 4 "id": "xxx", 5 "projectId": "yyy", 6 "hostname": "mongodb.example.com", 7 "port": 27017, 8 "links": [ 9 { 10 "rel": "self", 11 "href": "https://<ops-manager-host>/api/public/v1.0/projects/xxx/hosts/yyy" 12 }, 13 { 14 "rel": "http://mms.mongodb.com/project", 15 "href": "https://<ops-manager-host>/api/public/v1.0/projects/xxx" 16 } 17 ] 18 }
要了解更多信息,请参阅 Web 链接规范 。
注意
虽然 Web 链接规范 描述了一种在 HTTP 响应标头中包含链接的格式,但它不是必需的。为了使API易于浏览,它将链接包含在响应正文中,而不是在响应标头中。
列表
某些资源会返回实体列表。
例子
您可以请求项目中所有主机的列表。
当响应中需要实体列表时,结果将在两个查询参数的限制下批处理返回:
字段 | 定义 |
---|---|
| 页码(从 1 开始)。 如果未指定,则默认为 1。 |
| 每页要返回的项目数,最多 500 个。 如果未指定,则默认为 100。 |
响应实体包含三个字段:
字段 | 定义 |
---|---|
| 整个结果集中的项目总数。 示例,如果一个项目共有57台主机,而您使用 |
| 结果集,即实体文档的数组。 |
| 包含一到三个链接关系:
|
如果您请求实体列表但没有结果,则API将使用HTTP 200 状态代码和空results
数组进行响应。 在这种情情况下,它不会以 404 进行响应,因为实体列表在将来的某个时候可能不为空。
如果您在不存在的上下文中请求实体列表(即不存在的项目的主机列表),则会导致HTTP 404 响应状态。
例子
这是一个共有 57 台主机的项目中第二页(有 10 台主机)的HTTP响应:
1 { 2 3 "totalCount": 57, 4 "results": [ 5 { 6 "id": "yyy", 7 "projectId": "xxx", 8 // additional host properties... 9 }, 10 // additional host documents... 11 ], 12 "links": [ 13 { 14 "rel" : "self", 15 "href" : "https://www.mongodb.com/api/public/v1.0/projects/xxx/hosts?pageNum=2&itemsPerPage=10" 16 }, 17 { 18 "rel": "previous", 19 "href": "https://www.mongodb.com/api/public/v1.0/projects/xxx/hosts?itemsPerPage=10&pageNum=1" 20 }, 21 { 22 "rel": "next", 23 "href": "https://www.mongodb.com/api/public/v1.0/projects/xxx/hosts?itemsPerPage=10&pageNum=3" 24 } 25 ] 26 }
信封
某些客户端可能无法访问HTTP响应标头和/或状态代码。 在这种情况下,您可以请求响应包含envelope
,它只是JSON文档中的额外信息层,其中包含通常位于响应标头中的任何相关详细信息。
默认情况下, API不会将响应包含在信封中。 要请求一个,只需添加查询参数envelope=true
即可。
对于包含单个实体的响应,信封包含两个字段:
字段 | 定义 |
---|---|
| HTTP状态代码。 |
| 请求的实体。 |
对于包含实体列表的响应,已经有一个封装结果的信封,因此在这种情况下指定envelope=true
作为查询参数只会将status
字段添加到现有信封。
美观打印
默认情况下,Ops Manager 返回的JSON中的多余空格会被去掉。 要请求美观打印的JSON ,只需将pretty=true
查询参数附加到任何请求:
curl --user '{PUBLIC-KEY}:{PRIVATE-KEY}' --digest \ --header 'Accept: application/json' \ --include \ --request GET "{opsManagerHost}:{Port}/api/public/v1.0?pretty=true"
注意
为清楚起见,本文档中的所有示例都显示了美观打印的JSON ,尽管某些示例URL可能不包含这个额外的查询参数。
响应代码
响应利用标准HTTP响应代码,包括:
代码 | 含义 | 注意 |
---|---|---|
200 | 正常 | 请求成功。 这是对成功的 |
201 | 已创建 | 已创建新资源。 这是对成功的 |
202 | 已接受 | 已接受异步操作请求。 |
400 | Bad Request | 客户端请求出现问题。 |
401 | Unauthorized | 需要进行身份验证,但请求中未提供身份验证。 通常,这意味着请求中省略了摘要式身份验证信息、提供的档案不正确或不允许与给定API密钥关联的用户访问所请求的资源。 |
403 | Forbidden | 不允许访问指定的资源。 |
404 | 未找到 | 请求的资源不存在。 |
405 | 不允许的方法 | 指定的资源不支持该HTTP方法。 请记住,每个资源可能仅支持HTTP方法的子集。 示例,您不能 |
409 | 冲突 | 这通常是对创建或修改实体属性的请求的响应,当已经存在具有相同属性值的现有实体时,该属性是唯一的。 示例,如果您尝试项目与现有项目,则请求将失败。 |
5xx | 各种服务器错误 | 出现意外问题。 请稍后重试,并考虑通知 Ops Manager 支持。 |
Errors
当请求导致错误时,响应正文会包含一个JSON文档,其中包含有关Go原因的其他详细信息。该文档包含五个字段:
字段 | 数据类型 | 定义 |
---|---|---|
| 字符串 | API请求错误的人类可读描述。 |
| 整型 | HTTP 状态代码。 |
| 字符串 | 表示API请求错误的命名常量,如Ops Manager 管理 API 错误代码中所示。 |
| 字符串数组 | API请求中传递的参数列表。 |
| 字符串 | HTTP 状态代码定义。 |
例子
Ops Manager 会为格式不正确的请求返回此响应正文:
1 { 2 "detail" : "Cannot find resource /api/public/v1.0/softwareComponents/version.", 3 "error" : 404, 4 "errorCode" : "RESOURCE_NOT_FOUND", 5 "parameters" : [ "/api/public/v1.0/softwareComponents/version" ], 6 "reason" : "Not Found" 7 }
要查看代码列表,请参阅Ops Manager Administration API 错误代码。
身份验证
如前所述, MongoDB Ops Manager API使用HTTP摘要式身份验证。 摘要式身份验证的详细信息超出了本文档的范围,但它本质上需要用户名和密码,而这两个密码使用服务器生成的唯一值(称为随机数)进行哈希处理。 用户名用户名注册的MongoDB Ops Manager帐户的用户名,密码是与该帐户关联的公共API密钥。
请记住以下几点:
客户端使用服务器生成的随机数对用户名和密码进行哈希处理,然后将其发送回服务器以对请求进行身份验证。 根据摘要式身份验证规范,该随机数仅在短时间内有效。 这是为了防止重放攻击,因此您无法缓存随机数并永久使用它。
某些资源方法需要更高的安全性,并且还受到访问列表的额外保护,该列表只允许从列出的IP地址访问资源。 每个用户都配置自己的IP地址访问列表,允许访问资源。
Ops Manager 应用程序有一个角色的概念,它允许对允许用户执行的操作进行更细粒度的控制。 API资源也执行相同的授权规则,因此可以通过API密钥访问的资源和方法由授予关联用户的角色控制。
例子
对于
DELETE
主机,拥有用于发出请求的API密钥的用户必须是主机所属项目中的Project Monitoring Admin
或Project Owner
。许多资源都与项目(以前称为群组)绑定,以下形式的URL即可证明:
/api/public/v1.0/groups/{PROJECT-ID}/ 对于这些资源,与API密钥绑定的用户必须是项目成员,或者必须分配有
GLOBAL
角色之一。 否则,Ops Manager 应用程序将使用HTTP 401 错误进行响应。
自动化
自动化配置资源和获取最新计划的自动化状态资源提供的端点允许您修改项目的部署和检索部署状态。 您可以通过向 Ops Manager 发送新的自动化配置来修改部署。 您可以在自动化配置中描述和配置要部署的 MongoDB 进程。 Ops Manager 将此称为部署的“目标状态”。当您通过API提交新的自动化配置时,自动化会调整系统的当前状态以匹配目标状态。
重要
API中没有任何保护措施来防止并发修改。 如果两个管理员都从基于当前版本的配置开始,进行各自的修改,然后提交各自的修改,则以后来修改者为准。
更多信息
有关 Ops Manager 公共 API 中可用资源的完整参考,请参阅 Ops Manager 管理 API 资源 。