获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

检索数据

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

使用 GET 读取数据

我们可以通过向其 URL 端点发出GET请求来从 Firebase 数据库中读取数据。让我们继续上一节中的博客示例,并阅读我们所有的博客文章数据:

curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=pretty'

成功的请求将由200 OK HTTP 状态代码指示,响应将包含我们正在检索的数据。

添加 URI 参数

从 Firebase 数据库读取数据时,REST API 接受多个查询参数。下面列出了最常用的参数。如需完整列表,请参阅REST API 参考

授权

auth请求参数允许访问受Firebase 实时数据库规则保护的数据,并受所有请求类型的支持。如Firebase 项目中的用户中所述,该参数可以是您的 Firebase 应用程序的密钥或身份验证令牌。在以下示例中,我们发送带有auth参数的GET请求,其中CREDENTIAL是您的 Firebase 应用的密钥或身份验证令牌:

curl 'https://docs-examples.firebaseio.com/auth-example.json?auth=CREDENTIAL'

打印

指定print=pretty以人类可读的格式返回数据。

curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=pretty'

指定print=silent成功时返回204 No Content

curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=silent'

打回来

要从 Web 浏览器跨域进行 REST 调用,您可以使用JSONP将响应包装在 JavaScript 回调函数中。添加callback=以使 REST API 将返回的数据包装在您指定的回调函数中。例如:

<script>
  function gotData(data) {
    console.log(data);
  }
</script>
<script src="https://docs-examples.firebaseio.com/fireblog/posts.json?callback=gotData">

浅的

这是一项高级功能,旨在帮助您处理大型数据集,而无需下载所有内容。要使用它,请添加shallow=true作为参数。这将限制返回数据的深度。如果该位置的数据是 JSON 原语(字符串、数字或布尔值),则将简单地返回其值。如果该位置的数据快照是 JSON 对象,则每个键的值将被截断为true 。例如,使用以下数据:

{
  "message": {
    "user": {
      "name": "Chris"
    },
    "body": "Hello!"
  }
}

// A request to /message.json?shallow=true
// would return the following:
{
  "user": true,
  "body": true
}

// A request to /message/body.json?shallow=true
// would simply return:
"Hello!"

试试这个curl请求:

curl 'https://docs-examples.firebaseio.com/rest/retrieving-data.json?shallow=true&print=pretty'

暂停

使用它来限制读取在服务器端花费的时间。如果读取请求未在分配的时间内完成,它将以 HTTP 400 错误终止。当您希望传输少量数据并且不想等待太长时间来获取潜在的巨大子树时,这特别有用。实际读取时间可能因数据大小和缓存而异。

使用以下格式指定timeouts3ms3s3min ,带有数字和单位。如果未指定,将应用15min的最大timeout 。如果timeout不是正数或超过最大值,则请求将被拒绝并返回 HTTP 400 错误。在以下示例中, GET请求包括 10 秒的timeout

curl 'https://docs-examples.firebaseio.com/rest/retrieving-data.json?timeout=10s'

过滤数据

我们可以构造查询以根据各种因素过滤数据。首先,您可以使用orderBy参数指定您希望如何过滤数据。然后,将orderBy与其他五个参数中的任何一个结合起来: limitToFirstlimitToLaststartAtendAtequalTo

由于 Firebase 的所有人都认为恐龙很酷,因此我们将使用恐龙事实示例数据库中的片段来演示如何过滤数据:

{
  "lambeosaurus": {
    "height": 2.1,
    "length": 12.5,
    "weight": 5000
  },
  "stegosaurus": {
    "height": 4,
    "length": 9,
    "weight": 2500
  }
}

我们可以通过以下三种方式之一过滤数据:按子键按键或按。查询以这些参数之一开始,然后必须与以下一个或多个参数组合: startAtendAtlimitToFirstlimitToLastequalTo

按指定子键过滤

我们可以通过将公共子键传递给orderBy参数来过滤节点。例如,要检索所有高度大于 3 的恐龙,我们可以执行以下操作:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'

任何没有我们要过滤的子键的节点都将使用null值进行排序。有关数据如何排序的详细信息,请参阅数据如何排序

Firebase 还支持由深层嵌套的子级排序的查询,而不是仅向下一层的子级排序。如果您有这样的深层嵌套数据,这将很有用:

{
  "lambeosaurus": {
    "dimensions": {
      "height" : 2.1,
      "length" : 12.5,
      "weight": 5000
    }
  },
  "stegosaurus": {
    "dimensions": {
      "height" : 4,
      "length" : 9,
      "weight" : 2500
    }
  }
}

现在要查询高度,我们使用对象的完整路径而不是单个键:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="dimensions/height"&startAt=3&print=pretty'

查询一次只能按一个键过滤。在同一个请求上多次使用orderBy参数会引发错误。

按键过滤

我们还可以使用orderBy="$key"参数通过键过滤节点。以下示例检索名称以字母am开头的所有恐龙:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&startAt="a"&endAt="m"&print=pretty'

按值过滤

我们可以使用orderBy="$value"参数按子键的值过滤节点。假设恐龙正在参加一场恐龙运动比赛,我们以以下格式跟踪他们的分数:

{
  "scores": {
    "bruhathkayosaurus": 55,
    "lambeosaurus": 21,
    "linhenykus": 80,
    "pterodactyl": 93,
    "stegosaurus": 5,
    "triceratops": 22
  }
}

要检索所有得分高于 50 的恐龙,我们可以提出以下请求:

curl 'https://dinosaur-facts.firebaseio.com/scores.json?orderBy="$value"&startAt=50&print=pretty'

有关使用orderBy="$value"时如何对null 、布尔值、字符串和对象值进行排序的说明,请参阅数据如何排序。

复杂过滤

我们可以组合多个参数来构造更复杂的查询。

限制查询

limitToFirstlimitToLast参数用于设置接收数据的最大子节点数。如果我们将限制设置为 100,我们最多只能接收 100 个匹配的孩子。如果我们的数据库中存储的消息少于 100 条,我们将接收每个孩子。但是,如果我们有超过 100 条消息,我们将只接收其中 100 条消息的数据。如果我们使用limitToLast ,这些将是前 100 个有序消息,如果我们使用limitToFirst ,这些将是最后 100 个有序消息。

使用我们的恐龙事实数据库和orderBy ,我们可以找到两种最重的恐龙:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="weight"&limitToLast=2&print=pretty'

同样,我们可以使用limitToFirst找到两个最短的恐龙:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&limitToFirst=2&print=pretty'

我们还可以使用orderBy="$value"进行限制查询。如果我们想创建得分最高的前三名恐龙运动竞争对手的排行榜,我们可以执行以下操作:

curl 'https://dinosaur-facts.firebaseio.com/scores.json?orderBy="$value"&limitToLast=3&print=pretty'

范围查询

使用startAtendAtequalTo允许我们为查询选择任意起点和终点。例如,如果我们想找到所有至少三米高的恐龙,我们可以结合orderBystartAt

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'

我们可以使用endAt来查找所有名称在 Pterodactyl 字典序上位于 Pterodactyl 之前的恐龙:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&endAt="pterodactyl"&print=pretty'

我们可以结合startAtendAt来限制查询的两端。以下示例查找名称以字母“b”开头的所有恐龙:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&startAt="b"&endAt="b\uf8ff"&print=pretty'

当您需要对数据进行分页时,范围查询也很有用。

把它们放在一起

我们可以结合所有这些技术来创建复杂的查询。例如,也许您想查找所有身高小于或等于我们最喜欢的种类剑龙的恐龙的名称:

MY_FAV_DINO_HEIGHT=`curl "https://dinosaur-facts.firebaseio.com/dinosaurs/stegosaurus/height.json"`
curl "https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy=\"height\"&endAt=${MY_FAV_DINO_HEIGHT}&print=pretty"

数据如何排序

本节说明在使用三个过滤参数时如何对数据进行排序。

排序依据

当使用带有子键名称的orderBy时,包含指定子键的数据将按如下顺序排序:

  1. 具有指定子键的null值的子项首先出现。
  2. 接下来是指定子键的值为false的子项。如果多个孩子的值为false ,则它们按字典顺序键排序。
  3. 接下来是指定子键的值为true的子项。如果多个孩子的值为true ,则它们按字典顺序键排序。
  4. 接下来是具有数值的子项,按升序排序。如果指定子节点的多个子节点的数值相同,则按key排序。
  5. 字符串在数字之后,并按字典顺序升序排序。如果指定子节点的多个子节点具有相同的值,则它们按字典顺序键排序。
  6. 对象排在最后,并按关键字按字典顺序升序排序。
过滤后的结果无序返回。如果您的数据顺序很重要,您应该在从 Firebase 返回结果后对应用程序中的结果进行排序。

orderBy="$key"

当使用orderBy="$key"参数对数据进行排序时,数据将按 key 升序返回,如下所示。请记住,键只能是字符串。

  1. 具有可以被解析为 32 位整数的键的子项排在最前面,按升序排序。
  2. 以字符串值作为键的子项紧随其后,按字典顺序升序排序。

orderBy="$value"

使用orderBy="$value"参数对数据进行排序时,子项将按其值排序。排序标准与按子键排序的数据相同,只是使用节点的值而不是指定子键的值。

orderBy="$priority"

使用orderBy="$priority"参数对数据进行排序时,子项的顺序由它们的优先级和键确定,如下所示。请记住,优先级值只能是数字或字符串。

  1. 没有优先级(默认)的孩子优先。
  2. 接下来是优先考虑数字的孩子。它们按优先级从小到大按数字排序。
  3. 以字符串为优先的孩子排在最后。它们按优先级按字典顺序排序。
  4. 每当两个孩子具有相同的优先级(包括没有优先级)时,它们就会按键排序。数字键首先出现(按数字排序),然后是其余键(按字典顺序排序)。

有关优先级的更多信息,请参阅API 参考

从 REST API 流式传输

Firebase REST 端点支持EventSource / Server-Sent Events协议,可以轻松地将更改流式传输到 Firebase 数据库中的单个位置。

要开始使用流媒体,我们需要执行以下操作:

  1. 将客户端的 Accept 标头设置为text/event-stream
  2. 尊重 HTTP 重定向,特别是 HTTP 状态码 307
  3. 如果 Firebase 数据库位置需要读取权限,请包括auth查询参数

作为回报,服务器将在请求的 URL 处的数据状态发生变化时发送命名事件。这些消息的结构符合 EventSource 协议:

event: event name
data: JSON encoded data payload

服务器可能会发送以下事件:

JSON 编码的数据将是一个具有两个键的对象:路径和数据
路径指向相对于请求 URL 的位置
客户端应将其缓存中该位置的所有数据替换为消息中给出的数据
修补JSON 编码的数据将是一个具有两个键的对象:路径和数据
路径指向相对于请求 URL 的位置
对于数据中的每个键,客户端应将其缓存中的相应键替换为消息中该键的数据
活着此事件的数据为空,无需任何操作
取消此事件的数据为空
如果 Firebase 实时数据库规则导致不再允许在请求的位置进行读取,则会发送此事件
auth_revoked此事件的数据是一个字符串,表示凭证已过期
当提供的 auth 参数不再有效时,将发送此事件

以下是服务器可能发送的一组事件的示例:

// Set your entire cache to {"a": 1, "b": 2}
event: put
data: {"path": "/", "data": {"a": 1, "b": 2}}


// Put the new data in your cache under the key 'c', so that the complete cache now looks like:
// {"a": 1, "b": 2, "c": {"foo": true, "bar": false}}
event: put
data: {"path": "/c", "data": {"foo": true, "bar": false}}


// For each key in the data, update (or add) the corresponding key in your cache at path /c,
// for a final cache of: {"a": 1, "b": 2, "c": {"foo": 3, "bar": false, "baz": 4}}
event: patch
data: {"path": "/c", "data": {"foo": 3, "baz": 4}}

如果您使用 Go,请查看Firego ,它是 Firebase REST 和 Streaming API 的第三方包装器。