Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

检索数据

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

使用 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 之前的所有恐龙:

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="$键"

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

  1. 具有可以解析为 32 位整数的键的孩子排在第一位,按升序排序。
  2. 接下来是以字符串值作为键的子项,按字典顺序升序排序。

orderBy="$值"

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

orderBy="$优先级"

使用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 的第三方包装器。