使用 Firestore REST API
虽然 Firestore 最简单的用法是使用某个原生客户端库,但在有些情况下,直接调用 REST API 会很有用。
REST API 在以下使用情形中会很有帮助:
- 从资源受限的环境(如无法运行完整客户端库的物联网 (IoT) 设备)访问 Firestore。
- 自动执行数据库管理,或检索详细的数据库元数据。
如果您使用的是 gRPC 支持的编程语言,可以考虑使用 RPC API 而不是 REST API。
身份验证和授权
Firestore REST API 接受使用 Firebase 身份验证 ID 令牌或 Google Identity OAuth 2.0 令牌进行身份验证。您提供的令牌会影响您的请求的授权结果:
使用 Firebase ID 令牌对来自您应用用户的请求进行身份验证。对于这些请求,Firestore 使用 Cloud Firestore 安全规则来确定请求是否已获得授权。
使用 Google Identity OAuth 2.0 令牌和服务账号对来自您应用的请求(例如数据库管理请求)进行身份验证。对于这些请求,Firestore 使用 Identity and Access Management (IAM) 来确定请求是否已获得授权。
使用 Firebase ID 令牌
您可以通过两种方式获得 Firebase ID 令牌:
通过检索用户的 Firebase ID 令牌,您可以代表用户发出请求。
对于使用 Firebase ID 令牌进行身份验证的请求以及未经身份验证的请求,Firestore 会使用您的 Firestore 安全规则来确定请求是否已获得授权。
使用 Google Identity OAuth 2.0 令牌
您可以使用服务账号通过 Google API 客户端库生成一个访问令牌,或者根据为“服务器到服务器”应用使用 OAuth 2.0 中的步骤生成一个访问令牌。您还可以通过 gcloud
命令行工具使用 gcloud auth application-default print-access-token
命令生成令牌。
此令牌必须具有以下范围才能向 Firestore REST API 发送请求:
https://www.googleapis.com/auth/datastore
如果您使用服务账号和 Google Identity OAuth 2.0 令牌对您的请求进行身份验证,则 Firestore 会假定您的请求是代表您的应用(而非个人用户)执行操作。Firestore 将允许这些请求绕过您的安全规则。相反,Firestore 使用 IAM 来确定请求是否已获得授权。
您可以通过分配 Firestore IAM 角色来控制服务账号的访问权限。
使用访问令牌进行身份验证
获得 Firebase ID 令牌或 Google Identity OAuth 2.0 令牌后,请将其作为一个 Authorization
标头(设置为 Bearer {YOUR_TOKEN}
)传递给 Firestore 端点。
进行 REST 调用
所有 REST API 端点都存在于基准网址 https://firestore.googleapis.com/v1/
之下。
如需创建指向项目 YOUR_PROJECT_ID
下的集合 cities
中 ID 为 LA
的文档的路径,您可以使用以下结构。
/projects/YOUR_PROJECT_ID/databases/(default)/documents/cities/LA
如需与此路径进行互动,请将其与 API 基准网址组合在一起。
https://firestore.googleapis.com/v1/projects/YOUR_PROJECT_ID/databases/(default)/documents/cities/LA
要开始尝试使用 REST API,最好的方法是使用 API Explorer,它会自动生成 Google Identity OAuth 2.0 令牌,并允许您检查 API。
方法
下面将简要介绍两个最重要的方法组。如需查看完整列表,请参阅 REST API 参考文档或使用 API Explorer。
v1.projects.databases.documents
对文档执行增删改查操作,这与添加数据或获取数据指南中概述的方法类似。
v1.projects.databases.collectionGroups.indexes
对索引执行操作,例如创建新索引、停用现有索引或列出所有当前索引。这适用于自动化数据结构迁移或在多个项目间同步索引。
此方法还可用于检索文档元数据,例如给定文档的所有字段和子集合的列表。
错误代码
如果 Firestore 请求成功,Firestore API 将返回一个HTTP 200 OK
状态代码以及请求的数据。当请求失败时,Firestore API 将返回 HTTP 4xx
或 5xx
状态代码以及包含错误相关信息的响应。
下表列出了针对每个错误代码的建议操作。这些代码适用于 Firestore REST 和 RPC API。Firestore SDK 和客户端库可能不会返回这些错误代码。
规范错误代码 | 说明 | 建议执行的操作 |
---|---|---|
ABORTED |
该请求与另一请求冲突。 | 对于非事务性提交: 重试该请求或重新设计数据模型结构以减少争用。 对于事务中的请求: 重试整个事务或重新设计数据模型结构以减少争用。 |
ALREADY_EXISTS |
该请求尝试创建的文档已存在。 | 在解决问题之前,请勿重试。 |
DEADLINE_EXCEEDED |
处理请求的 Firestore 服务器超时。 | 使用指数退避重试。 |
FAILED_PRECONDITION |
请求不满足其中某个前提条件。例如,查询请求可能需要尚未定义的索引。请查看错误响应中的消息字段,了解未满足的前提条件。 | 在解决问题之前,请勿重试。 |
INTERNAL |
Firestore 服务器返回了错误。 | 不要多次重试此请求。 |
INVALID_ARGUMENT |
请求参数包含无效值。请参阅错误响应中的消息字段,了解无效值。 | 在解决问题之前,请勿重试。 |
NOT_FOUND |
该请求尝试更新的文档不存在。 | 在解决问题之前,请勿重试。 |
PERMISSION_DENIED |
该用户无权发出此请求。 | 在解决问题之前,请勿重试。 |
RESOURCE_EXHAUSTED |
项目超出其配额或区域/多区域容量。 | 确认您没有超出项目配额。如果您超出了项目配额,则必须解决问题再重试。 否则,请依照指数退避算法重试。 |
UNAUTHENTICATED |
请求不包含有效的身份验证凭据。 | 在解决问题之前,请勿重试。 |
UNAVAILABLE |
Firestore 服务器返回了错误。 | 使用指数退避重试。 |