Đọ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 GET
có timeout
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
, endAt
và equalTo
.
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 mã 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ố limitToFirst
và limitToLast
đượ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
, endAt
và equalTo
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 orderBy
và startAt
:
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 startAt
và endAt
để 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:
- Con có giá trị
null
cho khóa con được chỉ định sẽ được ưu tiên trước. - 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. - 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. - 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.
- 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.
- 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.
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.
- 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.
- 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.
- Trẻ em không có quyền ưu tiên (mặc định) được ưu tiên trước.
- 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.
- 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.
- 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 Sự kiện EventSource / Server-Sent , 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:
- Đặt tiêu đề Chấp nhận của khách hàng thành
text/event-stream
- Tôn trọng chuyển hướng HTTP, đặc biệt là mã trạng thái HTTP 307
- 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 |
vá | 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.