正在擷取資料

使用 GET 讀取資料

我們可以對 Firebase 資料庫的網址端點發出 GET 要求,藉此讀取資料。讓我們繼續使用上一節的網誌範例,讀取所有網誌文章資料:

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

如果要求成功,系統會傳回 200 OK HTTP 狀態碼,且回應會包含我們擷取的資料。

新增 URI 參數

從 Firebase 資料庫讀取資料時,REST API 會接受多個查詢參數。以下列出最常用的參數。如需完整清單,請參閱 REST API 參考資料

auth

auth 請求參數可存取受 Firebase Realtime Database Security Rules 保護的資料,且所有請求類型都支援這項參數。如「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'

callback

如要從網頁瀏覽器跨網域發出 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 則訊息的資料。如果使用 limitToFirst,這些訊息會是前 100 則排序訊息;如果使用 limitToLast,這些訊息會是最後 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

使用 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 串流

Firebase REST 端點支援 EventSource/伺服器推送事件通訊協定,因此可輕鬆將 Firebase 資料庫中單一位置的變更串流傳輸。

如要開始串流,請按照下列步驟操作:

  1. 將用戶端的 Accept 標頭設為 text/event-stream
  2. 遵守 HTTP 重新導向,尤其是 HTTP 狀態碼 307
  3. 如果 Firebase 資料庫位置需要讀取權限,請加入 auth 查詢參數

伺服器會傳送具名事件,做為所要求網址的資料狀態變更。這些訊息的結構符合 EventSource 通訊協定:

event: event name
data: JSON encoded data payload

伺服器可能會傳送下列事件:

put JSON 編碼資料會是含有兩個鍵的物件:路徑和資料
路徑會指向相對於要求網址的位置
用戶端應將快取中該位置的所有資料,替換為訊息中提供的資料
patch JSON 編碼資料會是含有兩個鍵的物件:路徑和資料
路徑會指向相對於要求網址的位置
對於資料中的每個鍵,用戶端應將快取中的對應鍵替換為訊息中該鍵的資料
保持運作 這個事件的資料為空值,無須採取任何行動
取消 這個事件的資料為空值
如果 Firebase Realtime Database Security Rules 導致系統不再允許在要求的位置讀取資料,就會傳送這個事件
auth_revoked 這個事件的資料是字串,表示憑證已過期
當提供的驗證參數失效時,系統就會傳送這個事件

以下是伺服器可能傳送的一組事件範例:

// 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 和串流 API 的第三方包裝函式。