公共 API 原则
Cloud Manager 公共API遵循REST架构原则来公开内部资源,从而提供对 Cloud Manager 功能的编程访问。
与通过 Web 界面进行的更改一样,通过 API 进行的更改也需遵守 Cloud Manager定价。 如果您添加服务器并产生费用,则必须在 Cloud Manager 文件一张有效的信用卡,否则帐户可能会被锁定。
API 具有以下功能:
- JSON实体
- 所有实体都以 JSON 表示。
- 可浏览界面
- 使用一致的链接机制,您可以从根资源开始,然后通过相关资源的链接来浏览整个 API。
- 用户访问控制
每个 Cloud Manager 用户的API功能与其Cloud Manager 角色授予的权限相匹配。
例子
无论是通过 Cloud Manager 用户界面还是API
,具有
Project Read Only
角色的用户都无法修改该项目中的任何资源。- API网络访问列表
Cloud Manager API可以通过API 访问列表保护对 Cloud Manager Administration API 的访问。此列表将对API的访问限制为特定的IP或CIDR地址。 每个API密钥都有自己的 Cloud Manager Administration API 访问列表。 当您使用Cloud Manager用户界面创建新的组织时,MongoDB Atlas默认启用API访问列表要求。
要了解更多信息,请参阅(可选)需要组织的 API 访问列表。
- 仅限HTTPS
- 您只能通过 HTTPS 访问 API ,这可确保通过网络发送的所有数据均使用 TLS 完全加密。
HTTP 方法
所有资源都支持这些常见HTTP方法的子集:
方法 | 用途 |
---|---|
| 检索资源的JSON表示形式。 |
| 使用提供的 JSON 表示形式创建新资源。 |
| 将资源替换为提供的JSON表示形式。 |
| 使用提供的JSON表示形式更新资源中的指定字段。 |
| 删除资源。 |
| 检索不带资源的JSON表示形式的响应标头。 |
JSON
所有实体均以JSON表示。 以下请求规则和响应约定适用:
请求规则
- 应用正确的内容类型标头
- 通过
POST
或PUT
向服务器发送JSON时,请确保指定正确的内容类型请求标头:
Content-Type: application/json
- 将日期设置为 ISO8601 字符串
将日期发送到服务器时(作为查询参数或
POST
或PATCH
请求实体中的字段),请使用根据 ISO8601 标准。如果不指定时区域, Cloud 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 }
响应约定
- 拒绝无效字段
无效字段会被拒绝,而不是被忽略。
例子
您尝试创建新实体并拼写错误其中一个字段,或者尝试更新现有实体并包含无法修改的字段,则 Cloud Manager 会使用HTTP 400 状态代码进行响应,并显示一条错误消息,说明哪个字段无效。
- 以 ISO 格式返回日期8601 字符串
- 所有日期均以 ISO8601 格式 返回 - 以 UTC 格式指定的字符串。
- 用于消除单位歧义的标签字段
包含特定单位数值的字段经过命名,以消除所使用单位的歧义。
例子
主机的正常运行时间以毫秒为单位返回,因此主机实体字段的名称是
uptimeMsec
。- 返回没有其他值的字段的默认值
没有当前值的字段将返回适当的默认值。
例子
Cloud Manager 没有新发现主机的任何统计信息,因此所有与统计信息相关的字段的值均为零。
将从实体中省略没有合理默认值的字段。
例子
未使用身份验证的主机会省略返回实体中的
username
字段。- 按字母顺序返回字段
- Cloud Manager 返回的JSON文档中的字段按字母顺序排列。订单可能会发生变化。 不要依赖字段的顺序。
链接
每个资源包括一个或多个指向子资源的链接和/或相关资源。
例子
主机具有指向其所属项目、副本集等的链接。
链接放置在实体的links
字段中,该实体是链接关系对象的数组。 每个链接关系都有两个字段:
字段 | 定义 |
---|---|
| 关系的名称(或类型)。 其中许多被视为扩展关系类型,并以 |
| 目标URL 。 |
所有实体都至少包含一个名为self
的链接关系,即实体自己的URL 。 当实体是列表的一部分时(即,请求项目中的所有主机时),它仅包含self
链接关系。
例子
这是包含一些链接的host
资源的一部分:
1 { 2 "id": "xxx", 3 "projectId": "yyy", 4 "hostname": "mongodb.example.com", 5 "port": 27017, 6 "links": [ 7 { 8 "rel": "self", 9 "href": "https://cloud.mongodb.com/api/public/v1.0/projects/xxx/hosts/yyy" 10 }, 11 { 12 "rel": "http://mms.mongodb.com/project", 13 "href": "https://cloud.mongodb.com/api/public/v1.0/projects/xxx" 14 } 15 ] 16 }
要了解更多信息,请参阅 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
字段添加到现有信封。
美观打印
默认情况下,会从 Cloud Manager 返回的JSON中去掉多余空格。要请求美观打印的JSON ,只需将pretty=true
查询参数附加到任何请求:
curl --user '{PUBLIC-KEY}:{PRIVATE-KEY}' --digest \ --header 'Accept: application/json' \ --include \ --request GET "https://cloud.mongodb.com/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 | 各种服务器错误 | 出现意外问题。 请稍后重试,并考虑通知 Cloud Manager 经理。 |
Errors
当请求导致错误时,响应正文会包含一个JSON文档,其中包含有关Go原因的其他详细信息。该文档包含五个字段:
字段 | 数据类型 | 定义 |
---|---|---|
| 字符串 | API请求错误的人类可读描述。 |
| 整型 | HTTP 状态代码。 |
| 字符串 | 表示API经理错误的命名常量,如Cloud Manager 经理 API 错误代码中所示。 |
| 字符串数组 | API请求中传递的参数列表。 |
| 字符串 | HTTP 状态代码定义。 |
例子
对于格式不正确的请求,Cloud 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 }
要查看代码列表,请参阅Cloud Manager Administration API 错误代码。
身份验证
Cloud Manager API使用两种方法之一对请求进行身份验证: API密钥或服务帐户。这可确保用提供服务户名和密码的密钥和访问权限令牌永远不会通过网络发送。 有关使用详情,请参阅对Cloud Manager的编程访问。
服务帐户 | API 密钥 |
---|---|
使用行业标准 OAuth2.0 协议和客户端档案流程向Cloud Manager进行身份验证的新方法。 | |
创建服务帐户后,您将使用其客户端ID和密钥生成访问权限令牌,以对API请求进行身份验证。根据 OAuth 2.0 规范,访问令牌的有效期仅为 1 小时(3600 秒)。访问权限令牌过期可以防止重放攻击,因为在重放攻击中,可以不受时间限制地使用泄露的访问权限令牌。 | Cloud Manager使用称为 随机数 的唯一值对公钥和私钥进行哈希处理。根据HTTP摘要规范,该随机数仅在短时间内有效。这是为了防止重放攻击,因此您无法缓存随机数并永久使用它。 |
Cloud ManagerCloud Manager角色限制服务帐户可以使用其访问权限令牌执行的操作。您必须像向用户授予角色一样向服务帐户授予角色,以确保访问权限令牌可以调用API端点而不会出现错误。 | |
Cloud Manager将许多资源绑定到一个项目。 许多API资源URL都遵循 | Cloud Manager将许多资源绑定到一个项目。 许多API资源URL都遵循 |
每个服务帐号仅属于一个组织,但您可以授予服务帐号访问权限,以访问该组织中任意数量的项目。 | 每个API密钥只属于一个组织,但您可以向该组织中任意数量的项目授予API密钥访问权限。 |
某些资源方法需要更高的安全性,并且还受到访问列表的额外保护,该列表只允许从列出的IP地址访问资源。 每个用户都配置自己的IP地址访问列表,允许访问资源。
自动化
自动化配置资源和获取最新计划的自动化状态资源提供的端点允许您修改项目的部署和检索部署状态。 您可以通过向 Cloud Manager 发送新的自动化配置来修改部署。 您可以在自动化配置中描述和配置要部署的 MongoDB 进程。 Cloud Manager 将此称为部署的“目标状态”。当您通过API提交新的自动化配置时,自动化会调整系统的当前状态以匹配目标状态。
重要
API中没有任何保护措施来防止并发修改。 如果两个管理员都从基于当前版本的配置开始,进行各自的修改,然后提交各自的修改,则以后来修改者为准。
速率限制
某些资源受到速率限制。
对于受到速率限制的资源,Cloud Manager 允许每个项目每分钟最多 100 个请求。请记住,公共API密钥会分配给 Cloud Manager 用户,但该用户可以访问多个项目。
例子
考虑两个用户:A 和 B。
用户 A 属于项目 X,用户 B 属于项目 X 和 Y。
下午 1:00:00,用户 A 向项目 X 中的速率受限资源发出 50 个请求,所有请求均在下午 1:00:20 之前完成。
下午 1:00:30,用户 B 尝试向项目 X 中的速率受限资源发出 60 个请求。
由于用户 A 在下午 1:00 已用完项目 X 的 50 个请求,因此已拒绝用户 B 尝试发出的最后 10 个请求。 然而,用户 B 可以向项目 Y 中的速率受限资源发出请求,因为每个项目都有一个单独的请求计数器。
下午 1:01,可以继续向项目 X 发出请求,因为用于速率限制的请求计数器每分钟都会重置。
如果超过速率限制, API将返回HTTP 429 Too Many Requests
响应代码。
更多信息
有关 Cloud Manager 公共 API 中提供的所有资源的完整参考,请参阅 Cloud Manager Administration API 资源 。