Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

檢索數據

使用 GET 讀取數據

我們可以通過發出讀取我們的火力地堡數據庫中的數據GET請求的URL端點。讓我們繼續上一節中的博客示例並閱讀我們所有的博客文章數據:

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

成功的要求會被指示200 OK HTTP狀態代碼,響應將包含的數據我們要取出。

添加 URI 參數

從 Firebase 數據庫讀取數據時,REST API 接受多個查詢參數。下面列出了最常用的參數。有關完整列表,請參閱REST API參考

授權

auth請求參數允許訪問受保護的數據火力地堡實時數據庫的規則,並且所有請求類型都支持。該參數可以是你的火力地堡的應用程序的秘密或驗證令牌,如所描述的火力地堡項目的用戶。在下面的例子中,我們發送GET與要求auth參數,其中CREDENTIAL要么是你的火力地堡的應用程序的秘密或身份驗證令牌:

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'

打回來

為了使跨域網絡瀏覽器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對象,每個鍵中的值將被截斷為。例如,使用以下數據:

{
  "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 錯誤終止。當您期望傳輸少量數據並且不想等待太長時間來獲取潛在的巨大子樹時,這尤其有用。實際讀取時間可能因數據大小和緩存而異。

指定timeouts使用以下格式: 3ms3s ,或3min ,以數字和一個單元。如果沒有指定,最大timeout15min將被應用。如果timeout不為正,或超過最大值,則請求將與HTTP 400錯誤被拒絕。在下面的例子中, GET請求包括timeout的10秒。

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
  }
}

通過,或按子鍵,:我們可以通過以下三種方式之一篩選數據。查詢與這些參數中的一個開始,然後必須使用一個或多個下列參數進行組合: startAtendAtlimitToFirstlimitToLast ,或equalTo

按指定的子鍵過濾

我們可以通過傳遞關鍵過濾由一個共同的孩子的關鍵節點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"參數。下面的例子中檢索與開始以字母a名稱的所有恐龍a通過m

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'

數據是如何有序關於如何解釋null使用時,布爾型,字符串和對象的值進行排序orderBy="$value"

複雜過濾

我們可以組合多個參數來構造更複雜的查詢。

限制查詢

limitToFirstlimitToLast參數用於設定孩子的針對其接收的數據的最大數量。如果我們將限制設置為 100,我們最多只能接收 100 個匹配的孩子。如果我們的數據庫中存儲的消息少於 100 條,我們將收到每個孩子。但是,如果我們有超過 100 條消息,我們只會收到其中 100 條消息的數據。如果我們使用這將是第100有序消息limitToFirst或最後100有序消息,如果我們使用limitToLast

使用我們的恐龍事實數據庫和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查找其名稱來自翼龍之前,按字典的恐龍:

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. 接下來是帶有數值的孩子,按升序排序。如果指定子節點的多個子節點具有相同的數值,則它們按關鍵字排序。
  5. 字符串在數字之後,按字典順序升序排列。如果指定子節點的多個子節點具有相同的值,則它們按字典順序按關鍵字排序。
  6. 對象排在最後,並按字典順序按鍵升序排序。
過濾後的結果無序返回。如果您的數據順序很重要,您應該在從 Firebase 返回結果後對應用程序中的結果進行排序。

orderBy="$key"

當使用orderBy="$key"參數對數據進行排序,數據將通過關鍵的升序排列如下返回。請記住,鍵只能是字符串。

  1. 具有可以解析為 32 位整數的鍵的子項首先出現,按升序排序。
  2. 接下來是以字符串值作為鍵的子項,按字典順序升序排列。

orderBy="$value"

當使用orderBy="$value"參數對數據進行排序,孩子們將通過他們的價值進行排序。排序標準與按子鍵排序的數據相同,只是使用節點的值而不是指定子鍵的值。

orderBy="$priority"

當使用orderBy="$priority"參數對數據進行排序,孩子的順序由它們的優先級和重點確定如下。請記住,優先級值只能是數字或字符串。

  1. 沒有優先級(默認)的孩子首先出現。
  2. 接下來是優先考慮數字的孩子。它們按優先級按數字排序,從小到大。
  3. 以字符串為優先的兒童排在最後。它們按字典順序按優先級排序。
  4. 每當兩個孩子具有相同的優先級(包括沒有優先級)時,它們就按鍵排序。數字鍵首先出現(按數字排序),然後是其餘鍵(按字典順序排序)。

有關優先級的詳細信息,請參閱API參考

從 REST API 流式傳輸

火力地堡REST端點支持的EventSource /服務器發送的事件的協議,因此很容易流變化到一個位置在我們的火力地堡數據庫。

要開始流式傳輸,我們需要執行以下操作:

  1. 將客戶端的接受頭text/event-stream
  2. 尊重 HTTP 重定向,尤其是 HTTP 狀態代碼 307
  3. 包括auth查詢參數,如果火力地堡數據庫位置需要權限讀取

作為回報,服務器將在請求的 URL 上的數據狀態更改時發送命名事件。這些消息的結構符合 EventSource 協議:

event: event name
data: JSON encoded data payload

服務器可能會發送以下事件:

JSON 編碼的數據將是一個具有兩個鍵的對象:路徑和數據
路徑指向相對於請求 URL 的位置
客戶端應該用消息中給出的數據替換其緩存中該位置的所有數據
修補JSON 編碼的數據將是一個具有兩個鍵的對象:路徑和數據
路徑指向相對於請求 URL 的位置
對於數據中的每個鍵,客戶端應該用消息中該鍵的數據替換其緩存中的相應鍵
活著此事件的數據為空,無需任何操作
取消此事件的數據為空
如果 Firebase 實時數據庫規則導致不再允許讀取請求的位置,則將發送此事件
授權撤銷此事件的數據是一個字符串,表示憑證已過期
當提供的 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}}

如果您使用去吧,看看Firego ,第三方包裝圍繞火力地堡REST和流媒體的API。