Truy xuất dữ liệu

Đọc dữ liệu với GET

Chúng tôi có thể đọc dữ liệu từ cơ sở dữ liệu Firebase của mình bằng cách đưa ra yêu cầu GET tới điểm cuối URL của nó. Hãy tiếp tục với ví dụ blog của chúng tôi từ phần trước và đọc tất cả dữ liệu bài đăng trên blog của chúng tôi:

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

Yêu cầu thành công sẽ được biểu thị bằng mã trạng thái HTTP 200 OK và phản hồi sẽ chứa dữ liệu mà chúng tôi đang truy xuất.

Thêm thông số URI

API REST chấp nhận một số tham số truy vấn khi đọc dữ liệu từ cơ sở dữ liệu Firebase của chúng tôi. Dưới đây là các thông số được sử dụng phổ biến nhất. Để có danh sách đầy đủ, hãy tham khảo Tham chiếu API REST .

auth

Tham số yêu cầu auth thực cho phép truy cập vào dữ liệu được bảo vệ bởi Quy tắc cơ sở dữ liệu thời gian thực của Firebase và được hỗ trợ bởi tất cả các loại yêu cầu. Đối số có thể là bí mật của ứng dụng Firebase của bạn hoặc mã thông báo xác thực, như được mô tả trong Người dùng trong Dự án Firebase . Trong ví dụ sau, chúng tôi gửi một yêu cầu GET với thông số auth , trong đó CREDENTIAL là bí mật của ứng dụng Firebase của bạn hoặc mã xác thực:

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

in

Chỉ định print=pretty trả về dữ liệu ở định dạng con người có thể đọc được.

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

Chỉ định print=silent trả về 204 No Content thành công.

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

gọi lại

Để thực hiện các cuộc gọi REST từ trình duyệt web trên các miền, bạn có thể sử dụng JSONP để bao bọc phản hồi trong một hàm gọi lại JavaScript. Thêm callback= để API REST bọc dữ liệu trả về trong hàm callback mà bạn chỉ định. Ví dụ:

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

Nông cạn

Đây là một tính năng nâng cao, được thiết kế để giúp bạn làm việc với bộ dữ liệu lớn mà không cần tải xuống mọi thứ. Để sử dụng nó, hãy thêm thông số shallow=true làm tham số. Điều này sẽ hạn chế độ sâu của dữ liệu trả về. Nếu dữ liệu tại vị trí là một nguyên thủy JSON (chuỗi, số hoặc boolean) thì giá trị của nó sẽ đơn giản được trả về. Nếu ảnh chụp nhanh dữ liệu tại vị trí là đối tượng JSON, các giá trị cho mỗi khóa sẽ bị cắt ngắn thành true . Ví dụ: sử dụng dữ liệu dưới đây:

{
  "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!"

Hãy thử nó với yêu cầu curl này:

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

hết giờ

Sử dụng điều này để giới hạn thời gian đọc ở phía máy chủ. Nếu một yêu cầu đọc không hoàn tất trong thời gian quy định, nó sẽ kết thúc với lỗi HTTP 400. Điều này đặc biệt hữu ích khi bạn mong đợi một quá trình truyền dữ liệu nhỏ và không muốn đợi quá lâu để tìm nạp một cây con khổng lồ tiềm năng. Thời gian đọc thực tế có thể thay đổi tùy theo kích thước dữ liệu và bộ nhớ đệm.

Chỉ định timeouts bằng cách sử dụng định dạng sau: 3ms , 3s hoặc 3min , với một số và một đơn vị. Nếu không được chỉ định, timeout tối đa là 15min sẽ được áp dụng. Nếu timeout không tích cực hoặc vượt quá mức tối đa, yêu cầu sẽ bị từ chối do lỗi HTTP 400. Trong ví dụ sau, yêu cầu GET bao gồm timeout là 10 giây.

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

Lọc dữ liệu

Chúng tôi có thể xây dựng các truy vấn để lọc dữ liệu dựa trên các yếu tố khác nhau. Để bắt đầu, bạn chỉ định cách bạn muốn dữ liệu của mình được lọc bằng cách sử dụng tham số orderBy . Sau đó, bạn kết hợp orderBy với bất kỳ tham số nào trong số năm tham số khác: limitToFirst , limitToLast , startAt , endAtequalTo .

Vì tất cả chúng tôi tại Firebase đều nghĩ rằng khủng long khá tuyệt, nên chúng tôi sẽ sử dụng một đoạn trích từ cơ sở dữ liệu mẫu về thông tin thực tế về khủng long để chứng minh cách bạn có thể lọc dữ liệu:

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

Chúng ta có thể lọc dữ liệu theo một trong ba cách: theo khóa con , theo khóa hoặc theo giá trị . Một truy vấn bắt đầu với một trong các tham số này, sau đó phải được kết hợp với một hoặc nhiều tham số sau: startAt , endAt , limitToFirst , limitToLast hoặc equalTo .

Lọc theo khóa con được chỉ định

Chúng ta có thể lọc các nút bằng một khóa con chung bằng cách chuyển khóa đó cho tham số orderBy . Ví dụ, để lấy tất cả các con khủng long có chiều cao lớn hơn 3, chúng ta có thể làm như sau:

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

Bất kỳ nút nào không có khóa con mà chúng tôi đang lọc sẽ được sắp xếp với giá trị null . Để biết chi tiết về cách dữ liệu được sắp xếp, hãy xem Cách dữ liệu được sắp xếp .

Firebase cũng hỗ trợ các truy vấn được sắp xếp theo thứ tự con cái lồng nhau sâu sắc, thay vì chỉ con cái thấp hơn một cấp. Điều này rất hữu ích nếu bạn có dữ liệu được lồng sâu như thế này:

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

Để truy vấn chiều cao ngay bây giờ, chúng tôi sử dụng đường dẫn đầy đủ đến đối tượng thay vì một khóa duy nhất:

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

Các truy vấn chỉ có thể lọc theo một khóa tại một thời điểm. Sử dụng tham số orderBy nhiều lần trên cùng một yêu cầu sẽ gây ra lỗi.

Lọc theo khóa

Chúng tôi cũng có thể lọc các nút theo khóa của chúng bằng cách sử dụng tham số orderBy="$key" . Ví dụ sau đây truy xuất tất cả các loài khủng long có tên bắt đầu bằng chữ cái a đến m :

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

Lọc theo giá trị

Chúng ta có thể lọc các nút theo giá trị của các khóa con của chúng bằng cách sử dụng tham số orderBy="$value" . Giả sử những con khủng long đang có một cuộc thi thể thao khủng long và chúng tôi đang theo dõi điểm số của chúng theo định dạng sau:

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

Để truy xuất tất cả những con khủng long có số điểm cao hơn 50, chúng tôi có thể đưa ra yêu cầu sau:

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

Xem Cách dữ liệu được sắp xếp để biết giải thích về cách sắp xếp các giá trị null , boolean, chuỗi và đối tượng khi sử dụng orderBy="$value" .

Lọc phức tạp

Chúng ta có thể kết hợp nhiều tham số để tạo các truy vấn phức tạp hơn.

Giới hạn truy vấn

Các tham số limitToFirstlimitToLast được sử dụng để đặt số lượng phần tử con tối đa để nhận dữ liệu. Nếu chúng tôi đặt giới hạn 100, chúng tôi sẽ chỉ nhận được tối đa 100 con phù hợp. Nếu chúng ta có ít hơn 100 tin nhắn được lưu trữ trong cơ sở dữ liệu của mình, chúng ta sẽ nhận được mọi tin nhắn con. Tuy nhiên, nếu chúng ta có hơn 100 tin nhắn, chúng ta sẽ chỉ nhận được dữ liệu cho 100 tin nhắn đó. Đây sẽ là 100 tin nhắn có thứ tự đầu tiên nếu chúng ta đang sử dụng limitToFirst hoặc 100 tin nhắn có thứ tự cuối cùng nếu chúng ta đang sử dụng limitToLast .

Bằng cách sử dụng cơ sở dữ liệu thông tin về khủng long và thứ tự của chúng tôi orderBy cách, chúng tôi có thể tìm thấy hai loài khủng long nặng nhất:

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

Tương tự, chúng ta có thể tìm thấy hai loài khủng long ngắn nhất bằng cách sử dụng limitToFirst :

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

Chúng tôi cũng có thể thực hiện các truy vấn giới hạn với orderBy="$value" . Nếu chúng tôi muốn tạo bảng xếp hạng với ba đối thủ thể thao khủng long có điểm số cao nhất, chúng tôi có thể làm như sau:

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

Truy vấn phạm vi

Sử dụng startAt , endAtequalTo cho phép chúng tôi chọn điểm bắt đầu và điểm kết thúc tùy ý cho các truy vấn của mình. Ví dụ: nếu chúng ta muốn tìm tất cả các loài khủng long cao ít nhất ba mét, chúng ta có thể kết hợp orderBystartAt :

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

Chúng ta có thể sử dụng endAt để tìm tất cả các loài khủng long có tên trước Pterodactyl về mặt từ vựng:

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

Chúng tôi có thể kết hợp startAtendAt để giới hạn cả hai đầu truy vấn của chúng tôi. Ví dụ sau tìm thấy tất cả các loài khủng long có tên bắt đầu bằng chữ cái "b":

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

Truy vấn phạm vi cũng hữu ích khi bạn cần phân trang dữ liệu của mình.

Để tất cả chúng cùng nhau

Chúng ta có thể kết hợp tất cả các kỹ thuật này để tạo ra các truy vấn phức tạp. Ví dụ: có thể bạn muốn tìm tên của tất cả các loài khủng long có chiều cao ngắn hơn hoặc bằng với loại yêu thích của chúng ta, Stegosaurus:

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"

Cách dữ liệu được sắp xếp

Phần này giải thích cách dữ liệu của bạn được sắp xếp khi sử dụng từng tham số lọc trong số ba tham số lọc.

đặt bởi

Khi sử dụng orderBy với tên của khóa con, dữ liệu có chứa khóa con được chỉ định sẽ được sắp xếp như sau:

  1. Các phần tử con có giá trị null cho khóa con được chỉ định sẽ đến trước.
  2. Các phần tử con có giá trị false cho khóa con được chỉ định sẽ xuất hiện tiếp theo. Nếu nhiều trẻ em có giá trị là false , chúng được sắp xếp theo từ điển theo khóa.
  3. Các phần tử con có giá trị true cho khóa con được chỉ định sẽ xuất hiện tiếp theo. Nếu nhiều trẻ em có giá trị là true , chúng được sắp xếp theo từ điển theo khóa.
  4. Các con có giá trị số đứng sau, được sắp xếp theo thứ tự tăng dần. Nếu nhiều nút con có cùng giá trị số cho nút con được chỉ định, chúng được sắp xếp theo khóa.
  5. Các chuỗi đứng sau các số và được sắp xếp theo từ vựng theo thứ tự tăng dần. Nếu nhiều nút con có cùng giá trị cho nút con được chỉ định, chúng được sắp xếp theo thứ tự từ điển theo khóa.
  6. Các đối tượng đến sau cùng và được sắp xếp theo từ điển theo khóa theo thứ tự tăng dần.
Các kết quả đã lọc được trả về không có thứ tự. Nếu thứ tự dữ liệu của bạn là quan trọng, bạn nên sắp xếp các kết quả trong ứng dụng của mình sau khi chúng được trả về từ Firebase.

orderBy = "$ key"

Khi sử dụng tham số orderBy="$key" để sắp xếp dữ liệu của bạn, dữ liệu sẽ được trả về theo thứ tự tăng dần theo khóa như sau. Hãy nhớ rằng khóa chỉ có thể là chuỗi.

  1. Các con có khóa có thể được phân tích cú pháp dưới dạng số nguyên 32 bit đứng trước, được sắp xếp theo thứ tự tăng dần.
  2. Các con có giá trị chuỗi làm khóa tiếp theo, được sắp xếp theo từ vựng theo thứ tự tăng dần.

orderBy = "$ value"

Khi sử dụng tham số orderBy="$value" để sắp xếp dữ liệu của bạn, các con sẽ được sắp xếp theo giá trị của chúng. Tiêu chí sắp xếp giống như dữ liệu được sắp xếp theo khóa con, ngoại trừ giá trị của nút được sử dụng thay vì giá trị của khóa con được chỉ định.

orderBy = "$ ưu tiên"

Khi sử dụng tham số orderBy="$priority" để sắp xếp dữ liệu của bạn, thứ tự của các phần tử con được xác định bởi mức độ ưu tiên và khóa của chúng như sau. Hãy nhớ rằng các giá trị ưu tiên chỉ có thể là số hoặc chuỗi.

  1. Trẻ em không được ưu tiên (mặc định) đến trước.
  2. Những đứa trẻ với một con số được ưu tiên của chúng sẽ đến tiếp theo. Chúng được sắp xếp theo số lượng theo mức độ ưu tiên, từ nhỏ đến lớn.
  3. Trẻ em có một chuỗi là mức độ ưu tiên của chúng đến sau cùng. Chúng được sắp xếp theo thứ tự từ vựng theo mức độ ưu tiên.
  4. Bất cứ khi nào hai trẻ em có cùng mức độ ưu tiên (kể cả không có mức độ ưu tiên), chúng được sắp xếp theo khóa. Các phím số đứng trước (được sắp xếp theo số), tiếp theo là các phím còn lại (được sắp xếp theo từ điển).

Để biết thêm thông tin về các mức độ ưu tiên, hãy xem tài liệu tham khảo API .

Truyền trực tuyến từ API REST

Các điểm cuối Firebase REST hỗ trợ giao thức EventSource / Server-Sent Events , giúp dễ dàng truyền các thay đổi đến một vị trí duy nhất trong cơ sở dữ liệu Firebase của chúng tôi.

Để bắt đầu phát trực tuyến, chúng ta cần thực hiện những việc sau:

  1. Đặt tiêu đề Chấp nhận của khách hàng thành text/event-stream
  2. Tôn trọng Chuyển hướng HTTP, cụ thể là mã trạng thái HTTP 307
  3. Bao gồm tham số truy vấn auth thực nếu vị trí cơ sở dữ liệu Firebase yêu cầu quyền đọc

Đổi lại, máy chủ sẽ gửi các sự kiện được đặt tên khi trạng thái của dữ liệu tại URL được yêu cầu thay đổi. Cấu trúc của những thông báo này tuân theo giao thức EventSource:

event: event name
data: JSON encoded data payload

Máy chủ có thể gửi các sự kiện sau:

đặt Dữ liệu được mã hóa JSON sẽ là một đối tượng có hai khóa: đường dẫn và dữ liệu
Đường dẫn trỏ đến một vị trí liên quan đến URL yêu cầu
Máy khách nên thay thế tất cả dữ liệu tại vị trí đó trong bộ nhớ cache của nó bằng dữ liệu được cung cấp trong thông báo
Dữ liệu được mã hóa JSON sẽ là một đối tượng có hai khóa: đường dẫn và dữ liệu
Đường dẫn trỏ đến một vị trí liên quan đến URL yêu cầu
Đối với mỗi khóa trong dữ liệu, máy khách nên thay thế khóa tương ứng trong bộ nhớ cache của nó bằng dữ liệu cho khóa đó trong thông báo
cố sống đi Dữ liệu cho sự kiện này là rỗng, không cần thực hiện hành động nào
sự hủy bỏ Dữ liệu cho sự kiện này là rỗng
Sự kiện này sẽ được gửi nếu Quy tắc cơ sở dữ liệu thời gian thực của Firebase khiến việc đọc tại vị trí được yêu cầu không còn được phép
auth_revoked Dữ liệu cho sự kiện này là một chuỗi cho biết rằng thông tin xác thực đã hết hạn
Sự kiện này sẽ được gửi khi thông số xác thực đã cung cấp không còn hợp lệ

Dưới đây là ví dụ về một tập hợp các sự kiện mà máy chủ có thể gửi:

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

Nếu bạn đang sử dụng Go, hãy xem Firego , một trình bao bọc của bên thứ ba xung quanh API REST và Truyền trực tuyến của Firebase.