使用 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 4xx5xx 状态代码以及包含错误相关信息的响应。

下表列出了针对每个错误代码的建议操作。这些代码适用于 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 服务器返回了错误。 使用指数退避重试。