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 chúng tôi đang truy xuất.

Thêm tham 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 tham số được sử dụng phổ biến nhất. Để biết danh sách đầy đủ, hãy tham khảo Tài liệu tham khảo API REST .

xác thực

Tham số yêu cầu auth cho phép truy cập vào dữ liệu được bảo vệ bởi Quy tắc bảo mật cơ sở dữ liệu thời gian thực 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 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 yêu cầu GET có tham số auth , trong đó CREDENTIAL là bí mật của ứng dụng Firebase hoặc mã thông báo xác thực:

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

in

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

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

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

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

gọi lại

Để thực hiện lệnh gọi REST từ trình duyệt web trên nhiều miền, bạn có thể sử dụng JSONP để gói phản hồi trong hàm gọi lại JavaScript. Thêm callback= để API REST bao bọc dữ liệu được trả về trong hàm gọi lại 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

Đâ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 các tập dữ liệu lớn mà không cần phải tải xuống mọi thứ. Để sử dụng nó, hãy thêm shallow=true làm tham số. Điều này sẽ hạn chế độ sâu của dữ liệu được trả về. Nếu dữ liệu tại vị trí đó là dữ liệu gốc JSON (chuỗi, số hoặc boolean) thì giá trị của nó sẽ được trả về đơn giản. Nếu ảnh chụp nhanh dữ liệu tại vị trí đó là một đối tượng JSON thì 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 yêu cầu đọc không hoàn thành trong thời gian quy định, yêu cầu đó 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 lượng dữ liệu nhỏ được truyền đi và không muốn đợi quá lâu để tìm nạp một cây con có tiềm năng rất lớn. 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 định dạng sau: 3ms , 3s hoặc 3min , kèm theo số và đơ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 dương hoặc vượt quá mức tối đa, yêu cầu sẽ bị từ chối với lỗi HTTP 400. Trong ví dụ sau, yêu cầu GETtimeout là 10 giây.

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

Lọc dữ liệu

Chúng ta có thể xây dựng các truy vấn để lọc dữ liệu dựa trên nhiều yếu tố khác nhau. Để bắt đầu, bạn chỉ định cách bạn muốn lọc dữ liệu của mình bằ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ố còn lại: limitToFirst , limitToLast , startAt , endAtequalTo .

Vì tất cả chúng tôi tại Firebase đều cho rằng khủng long khá thú vị 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ề các sự kiện khủng long để minh họa 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ị . Truy vấn bắt đầu bằng 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 theo một khóa con chung bằng cách chuyển khóa đó tới tham số orderBy . Ví dụ: để lấy tất cả 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 sắp xếp dữ liệu, hãy xem Cách sắp xếp dữ liệu .

Firebase cũng hỗ trợ các truy vấn được sắp xếp theo thứ tự của các phần tử con được lồng sâu, thay vì chỉ có các phần tử con ở dưới 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 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'

Truy vấn chỉ có thể lọc theo một khóa mỗi lần. Việc 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 ta cũng có thể lọc các nút theo khóa của chúng bằng tham số orderBy="$key" . Ví dụ sau truy xuất tất cả 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 khóa con bằng cách sử dụng tham số orderBy="$value" . Giả sử những con khủng long đang tham gia một cuộc thi thể thao về 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ả khủng long có đ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ố để xây dựng 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 con tối đa sẽ nhận dữ liệu. Nếu chúng tôi đặt giới hạn là 100, chúng tôi sẽ chỉ nhận được tối đa 100 trẻ em phù hợp. Nếu chúng tôi có ít hơn 100 tin nhắn được lưu trữ trong cơ sở dữ liệu của mình, chúng tôi sẽ nhận được mọi đứa trẻ. Tuy nhiên, nếu chúng tôi có hơn 100 tin nhắn, chúng tôi sẽ chỉ nhận được dữ liệu cho 100 tin nhắn đó. Đây sẽ là 100 tin nhắn được đặt hàng đầu tiên nếu chúng ta đang sử dụng limitToFirst hoặc 100 tin nhắn được đặt hàng cuối cùng nếu chúng ta đang sử dụng limitToLast .

Sử dụng cơ sở dữ liệu thông tin về khủng long và orderBy , chúng ta 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ể tiến hành các truy vấn giới hạn với orderBy="$value" . Nếu chúng ta muốn tạo một bảng xếp hạng với ba đối thủ thể thao khủng long có điểm cao nhất, chúng ta 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

Việc sử dụng startAt , endAtequalTo cho phép chúng ta 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 đứng trước Pterodactyl theo từ điển:

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

Chúng ta có thể kết hợp startAtendAt để giới hạn cả hai đầu truy vấn của mình. 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ữ "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 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 thấp hơn hoặc bằng với loài chúng ta yêu thích, 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"

Dữ liệu được sắp xếp như thế nào

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ố 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 chứa khóa con được chỉ định sẽ được sắp xếp như sau:

  1. Con có giá trị null cho khóa con được chỉ định sẽ được ưu tiên trước.
  2. Tiếp theo là các phần tử con có giá trị false cho khóa con được chỉ định. Nếu nhiều phần tử con có giá trị false , chúng sẽ được sắp xếp theo từ điển theo khóa.
  3. Tiếp theo là các trẻ em có giá trị true cho khóa con được chỉ định. Nếu nhiều phần tử con có giá trị true thì chúng sẽ được sắp xếp theo từ điển theo khóa.
  4. Tiếp theo là những phần tử có giá trị số, đượ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 thì chúng sẽ đượ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 thứ tự từ điển 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 sẽ được sắp xếp theo thứ tự từ điển theo khóa.
  6. Các đối tượng ở cuối cùng và được sắp xếp theo từ điển 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 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. Trẻ em có khóa có thể được phân tích cú pháp dưới dạng số nguyên 32 bit sẽ được xếp trước, được sắp xếp theo thứ tự tăng dần.
  2. Những phần tử con có giá trị chuỗi làm khóa sẽ xuất hiện tiếp theo, được sắp xếp theo từ điển 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 phần tử 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 cho 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 theo mức độ ưu tiên và khóa của chúng như sau. Hãy nhớ rằng giá trị ưu tiên chỉ có thể là số hoặc chuỗi.

  1. Trẻ em không có quyền ưu tiên (mặc định) được ưu tiên trước.
  2. Tiếp theo là những đứa trẻ được ưu tiên chọn số. Chúng được sắp xếp theo số lượng ưu tiên, từ nhỏ đến lớn.
  3. Những đứa trẻ được ưu tiên xếp hàng cuối cùng. Chúng được sắp xếp theo thứ tự từ điển theo mức độ ưu tiên.
  4. Bất cứ khi nào hai đứa trẻ có cùng mức độ ưu tiên (bao gồm cả không có mức độ ưu tiên), chúng sẽ được sắp xếp theo khóa. Các phím số đứng đầu (đượ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ề mức độ ưu tiên, hãy xem tài liệu tham khảo API .

Truyền phát từ API REST

Đ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í 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 làm như 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 biệt là mã trạng thái HTTP 307
  3. Bao gồm tham số truy vấn auth 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 dưới dạng trạng thái của dữ liệu tại các thay đổi URL được yêu cầu. Cấu trúc của các 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ộ đệm của nó bằng dữ liệu được cung cấp trong tin nhắn
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ộ đệm của nó bằng dữ liệu cho khóa đó trong tin nhắn
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
Hủy bỏ Dữ liệu cho sự kiện này là null
Sự kiện này sẽ được gửi nếu Quy tắc bảo mật cơ sở dữ liệu thời gian thực 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 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 được cung cấp không còn hợp lệ

Dưới đây là ví dụ về 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 , trình bao bọc của bên thứ ba xung quanh Firebase REST và API phát trực tuyến.