API REST của cơ sở dữ liệu Firebase

Sử dụng API

Bạn có thể sử dụng bất kỳ URL nào của Cơ sở dữ liệu theo thời gian thực của Firebase làm điểm cuối REST. Tất cả những gì bạn cần cần làm là nối .json vào cuối URL và gửi một yêu cầu từ ứng dụng HTTPS mà bạn yêu thích.

Giao thức HTTPS là bắt buộc. Firebase chỉ phản hồi lưu lượng truy cập đã mã hoá để dữ liệu của bạn vẫn được an toàn.

GET – Đọc dữ liệu

Hệ thống có thể đọc dữ liệu trên Realtime Database bằng cách phát một giao thức HTTP Yêu cầu GET đến một điểm cuối. Ví dụ sau đây cho thấy cách bạn có thể truy xuất mà bạn đã lưu trữ trước đó trong Realtime Database.

curl 'https://[PROJECT_ID].firebaseio.com/users/jack/name.json'

Yêu cầu thành công được biểu thị bằng một HTTP 200 OK mã trạng thái. Phản hồi chứa dữ liệu liên quan đến đường dẫn trong yêu cầu GET.

{ "first": "Jack", "last": "Sparrow" }

PUT – Ghi dữ liệu

Bạn có thể ghi dữ liệu bằng yêu cầu PUT.

curl -X PUT -d '{ "first": "Jack", "last": "Sparrow" }' \
  'https://[PROJECT_ID].firebaseio.com/users/jack/name.json'

Yêu cầu thành công được biểu thị bằng một HTTP 200 OK mã trạng thái. Phản hồi chứa dữ liệu được chỉ định trong Yêu cầu PUT.

{ "first": "Jack", "last": "Sparrow" }

POST - Đẩy dữ liệu

Để hoàn tất mã tương đương với push() của JavaScript (xem Danh sách dữ liệu), bạn có thể đưa ra yêu cầu POST.

curl -X POST -d '{"user_id" : "jack", "text" : "Ahoy!"}' \
  'https://[PROJECT_ID].firebaseio.com/message_list.json'

Yêu cầu thành công được biểu thị bằng trạng thái HTTP 200 OK . Phản hồi có chứa tên con của dữ liệu mới được chỉ định trong yêu cầu POST.

{ "name": "-INOQPH-aV_psbk3ZXEX" }

PATCH - Cập nhật dữ liệu

Bạn có thể cập nhật thông tin về các phần tử cụ thể tại một vị trí mà không cần ghi đè dữ liệu hiện có bằng cách sử dụng yêu cầu PATCH. Trẻ em được đặt tên trong dữ liệu đang được ghi bằng PATCH sẽ bị ghi đè, nhưng vẫn được bỏ qua phần tử con sẽ không bị xoá. Điều này tương đương với JavaScript Hàm update().

curl -X PATCH -d '{"last":"Jones"}' \
 'https://[PROJECT_ID].firebaseio.com/users/jack/name/.json'

Yêu cầu thành công được biểu thị bằng trạng thái HTTP 200 OK . Phản hồi chứa dữ liệu được chỉ định trong Yêu cầu PATCH.

{ "last": "Jones" }

XÓA – Đang xoá dữ liệu

Bạn có thể xoá dữ liệu bằng yêu cầu DELETE:

curl -X DELETE \
  'https://[PROJECT_ID].firebaseio.com/users/jack/name/last.json'

Yêu cầu DELETE thành công được biểu thị bằng Mã trạng thái HTTP 200 OK với phản hồi chứa JSON null.

Ghi đè phương thức

Nếu bạn thực hiện lệnh gọi REST từ một trình duyệt không hỗ trợ các phương thức trước đó, bạn có thể ghi đè phương thức yêu cầu bằng cách tạo Yêu cầu POST và đặt phương thức của bạn bằng cách sử dụng tiêu đề của yêu cầu X-HTTP-Method-Override.

curl -X POST -H "X-HTTP-Method-Override: DELETE" \
  'https://[PROJECT_ID].firebaseio.com/users/jack/name/last.json'

Bạn cũng có thể sử dụng tham số truy vấn x-http-method-override.

curl -X POST \
  'https://[PROJECT_ID].firebaseio.com/users/jack/name/last.json?x-http-method-override=DELETE'

Yêu cầu có điều kiện

Các yêu cầu có điều kiện, phiên bản tương đương của Kiến trúc chuyển trạng thái đại diện (REST) cho hoạt động giao dịch của SDK, cập nhật dữ liệu theo một điều kiện nhất định. Xem tổng quan về quy trình công việc và tìm hiểu thêm về yêu cầu có điều kiện cho REST trong mục Save Data (Lưu dữ liệu).

Thẻ ETag Firebase

Firebase ETag là giá trị nhận dạng duy nhất cho dữ liệu hiện tại ở một vị trí cụ thể. Nếu khi dữ liệu thay đổi tại vị trí đó, thì ETag cũng thay đổi. Bạn phải chỉ định thẻ ETag Firebase trong cho yêu cầu REST ban đầu (thường là GET nhưng có thể là bất kỳ giá trị nào khác ngoài PATCH).

curl -i 'https://[PROJECT_ID].firebaseio.com/posts/12345/upvotes.json' -H 'X-Firebase-ETag: true'

nếu-khớp

Điều kiện if-match chỉ định giá trị ETag cho dữ liệu mà bạn muốn cập nhật. Nếu bạn dùng điều kiện, Realtime Database chỉ hoàn tất các yêu cầu mà ETag được chỉ định trong yêu cầu ghi khớp với ETag của dữ liệu hiện có trong cơ sở dữ liệu. Tìm nạp ETag tại vị trí có yêu cầu Firebase ETag. Nếu bạn muốn ghi đè bất kỳ vị trí nào rỗng, sử dụng null_etag.

curl -iX PUT -d '11' 'https://[PROJECT_ID].firebaseio.com/posts/12345/upvotes.json' -H 'if-match: [ETAG_VALUE]'

Số lượt phản hồi dự kiến

Bảng sau đây cung cấp thông tin tổng quan về các phản hồi dự kiến cho mỗi loại yêu cầu, dựa trên kết quả trùng khớp ETag.

Loại yêu cầu "X-Firebase-ETag: true" ETag khớp với
if_match: <matching etag>
ETag không khớp với
if_match: <no matching etag>
TẢI Trạng thái/nội dung phản hồi 200: "<data_at_path>" 400: "...không được hỗ trợ.." 400: "...không được hỗ trợ.."
Tiêu đề đã thêm Thẻ ETag: <ETag_of_data> Không áp dụng Không áp dụng
ĐẶT Trạng thái/nội dung phản hồi 200: "<put_data>" 200: "<put_data>" 412: "...ETag không khớp.."
Tiêu đề đã thêm Thẻ ETag: <ETag_of_put_data> Không áp dụng Thẻ ETag: <database_ETag>
SAU KHI TRIỂN KHAI Trạng thái/nội dung phản hồi 200: "<post_data>" 400: "...không được hỗ trợ.." 400: "...không được hỗ trợ.."
Tiêu đề đã thêm Thẻ ETag: <ETag_of_post_data> Không áp dụng Không áp dụng
CHỨC DANH Trạng thái/nội dung phản hồi 400: "...không được hỗ trợ.." 400: "...không được hỗ trợ.." 400: "...không được hỗ trợ.."
Tiêu đề đã thêm Không áp dụng Không có Không áp dụng
XOÁ Trạng thái/nội dung phản hồi 200: rỗng 200: "<data_after_put>" 412: "...Thẻ ETag không khớp.."
Tiêu đề đã thêm Thẻ ETag: <ETag_of_null> Không áp dụng Thẻ ETag: <database_ETag>

Tham số truy vấn

API REST của cơ sở dữ liệu Firebase chấp nhận các tham số truy vấn sau và giá trị:

access_token

Được tất cả các loại yêu cầu hỗ trợ. Xác thực yêu cầu này để cho phép quyền truy cập vào dữ liệu được bảo vệ bằng Firebase Realtime Database Security Rules. Hãy xem Tài liệu xác thực REST để biết thông tin chi tiết.

curl 'https://[PROJECT_ID].firebaseio/users/jack/name.json?access_token=CREDENTIAL'

nông

Đây là tính năng nâng cao, được thiết kế để giúp bạn làm việc với mà không cần tải mọi thứ xuống. Đặt thành true để giới hạn độ sâu của dữ liệu được trả về tại một vị trí. 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ẽ chỉ được trả về. Nếu Tổng quan nhanh dữ liệu tại vị trí này là một đối tượng JSON, giá trị cho mỗi khóa sẽ được cắt ngắn thành true.

Đối số Phương thức REST Mô tả
vàng NHẬN Giới hạn độ sâu của phản hồi.
curl 'https://[PROJECT_ID].firebaseio/.json?shallow=true'

Lưu ý rằng không thể kết hợp shallow với bất kỳ truy vấn nào khác tham số.

in

Định dạng dữ liệu được trả về trong phản hồi từ máy chủ.

Đối số Phương thức REST Mô tả
Xinh GET, PUT, POST, PATCH, DELETE Xem dữ liệu ở định dạng mà con người có thể đọc được.
tắt tiếng GET, PUT, POST, PATCH Dùng để chặn đầu ra từ máy chủ khi ghi dữ liệu. Phản hồi thu được sẽ trống và được biểu thị bằng mã trạng thái HTTP 204 No Content.
curl 'https://[PROJECT_ID].firebaseio.com/users/jack/name.json?print=pretty'
curl -X PUT -d '{ "first": "Jack", "last": "Sparrow" }' \
  'https://[PROJECT_ID].firebaseio.com/users/jack/name.json?print=silent'

số gọi lại

Chỉ do GET hỗ trợ. Cách thực hiện cuộc 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 một JavaScript hàm callback. Thêm callback= để gói API REST dữ liệu được trả về trong hàm callback mà bạn chỉ định.

<script>
  function gotData(data) {
    console.log(data);
  }
</script>
<script src="https://[PROJECT_ID].firebaseio.com/.json?callback=gotData"></script>

định dạng

Nếu bạn đặt thành export, máy chủ sẽ mã hoá các mức độ ưu tiên trong của bạn.

Đối số Phương thức REST Mô tả
xuất NHẬN Thêm thông tin ưu tiên vào câu trả lời.
curl 'https://[PROJECT_ID].firebaseio.com/.json?format=export'

tải xuống

Chỉ do GET hỗ trợ. Nếu bạn muốn kích hoạt một tệp tải dữ liệu của bạn xuống từ trình duyệt web, hãy thêm download=. Việc này sẽ khiến dịch vụ REST thêm tiêu đề thích hợp để trình duyệt biết cần lưu dữ liệu vào tệp.

curl 'https://[PROJECT_ID].firebaseio/.json?download=myfilename.txt'

tạm ngừng

Sử dụng tính năng này để giới hạn thời gian đọc ở phía máy chủ. Nếu một lượt đọc không kết thúc trong thời gian quy định mà sẽ chấm dứt bằng một HTTP Lỗi 400. Điều này đặc biệt hữu ích khi bạn muốn chuyển một lượng dữ liệu nhỏ và không muốn đợi quá lâu để tìm nạp cây con có khả năng rất lớn. Thực tế thời gian đọc có thể khác nhau tuỳ theo kích thước dữ liệu và bộ nhớ đệm.

Hãy 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 đã chỉ định, timeout tối đa của 15min sẽ là áp dụng. Nếu timeout không dương hoặc vượt quá giá trị tối đa, yêu cầu sẽ bị từ chối kèm theo lỗi HTTP 400.

ghi Giới hạn kích thước

Để giới hạn kích thước của một lượt ghi, bạn có thể chỉ định tham số truy vấn writeSizeLimittiny (mục tiêu=1 giây), small (mục tiêu=10 giây), medium (mục tiêu=30 giây), large (mục tiêu=60 giây). Cơ sở dữ liệu theo thời gian thực ước tính kích thước của mỗi yêu cầu ghi và huỷ sẽ mất nhiều thời gian hơn thời gian mục tiêu.

Nếu bạn chỉ định unlimited, thì lượt ghi cực lớn (với tải trọng tối đa 256 MB) được phép, có thể chặn các yêu cầu tiếp theo trong khi cơ sở dữ liệu xử lý hoạt động hiện tại. Bạn không thể huỷ thao tác ghi sau khi đến máy chủ.

curl -X DELETE 'https://docs-examples.firebaseio.com/rest/delete-data.json?writeSizeLimit=medium'

Bạn sẽ thấy thông báo lỗi sau nếu giá trị ghi quá lớn:

Error: WRITE_TOO_BIG: Data to write exceeds the maximum size that can be modified with a single request.

Ngoài ra, bạn có thể đặt defaultWriteSizeLimit cho toàn bộ cơ sở dữ liệu thực thể bằng cách sử dụng Giao diện dòng lệnh (CLI) của Firebase. Giới hạn này áp dụng cho tất cả các yêu cầu, kể cả yêu cầu từ SDK. Các cơ sở dữ liệu mới sẽ được tạo bằng cách đặt defaultWriteSizeLimit thành large. Bạn không thể đặt defaultWriteSizeLimit thành tiny bằng giao diện dòng lệnh (CLI) của Firebase.

firebase database:settings:set defaultWriteSizeLimit large

orderBy

Xem phần này trong hướng dẫn về dữ liệu được đặt hàng để biết thêm thông tin.

limitToFirst, limitToLast, startAt, endAt, equalsTo

Xem phần này trong hướng dẫn về lọc dữ liệu cho biết thêm thông tin.

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

Điểm cuối REST của Firebase hỗ trợ Sự kiện EventSource / Sự kiện do máy chủ gửi giao thức. Để phát trực tuyến các thay đổi đối với một vị trí duy nhất trong Realtime Database của bạn: bạn cần làm một số việc:

  • Đặt tiêu đề Chấp nhận của ứng dụng thành "text/event-stream"
  • Tuân thủ chuyển hướng HTTP, cụ thể là mã trạng thái HTTP 307
  • Nếu vị trí đó yêu cầu quyền để đọc, bạn phải cung cấp Tham số auth

Đổ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 về URL được yêu cầu. Cấu trúc của các thông báo này tuân thủ giao thức EventSource.

event: event name
data: JSON encoded data payload

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

đặt

Dữ liệu được mã hoá JSON là một đối tượng có hai khoá: pathdữ liệu. Đường dẫn trỏ đến một so với URL yêu cầu. Khách hàng nên thay thế tất cả dữ liệu tại vị trí đó trong bộ nhớ đệm kèm theo dữ liệu.

bản vá

Dữ liệu được mã hoá JSON là một đối tượng có hai khoá: pathdữ liệu. Đường dẫn trỏ đến một so với URL yêu cầu. Đối với mỗi khoá trong data, thì ứng dụng khách sẽ thay thế thuộc tính khoá tương ứng trong bộ nhớ đệm với dữ liệu cho khoá đó trong thông báo.

duy trì hoạt động

Dữ liệu của sự kiện này là null. Bạn không cần phải làm gì khác.

hủy

Một số lỗi không mong muốn có thể gửi sự kiện "cancel" và chấm dứt kết nối. Nguyên nhân được mô tả trong dữ liệu được cung cấp cho sự kiện này. Có thể kể đến một số nguyên nhân như sau: 1. Firebase Realtime Database Security Rules không còn cho phép đọc ở vị trí được yêu cầu nữa. Chiến lược phát hành đĩa đơn Nội dung mô tả "dữ liệu" cho nguyên nhân này là "Quyền bị từ chối". 2. Một lượt ghi đã kích hoạt một trình truyền trực tuyến sự kiện đã gửi một cây JSON lớn vượt quá giới hạn của chúng tôi, 512MB. "Dữ liệu" của nguyên nhân này là "Tải trọng đã chỉ định quá lớn, vui lòng yêu cầu với ít dữ liệu hơn."

bị thu hồi xác thực

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 được gửi khi auth đã cung cấp tham số không còn hợp lệ.

Dưới đây là ví dụ về một tập hợp 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}}

Ưu tiên

Bạn có thể tham chiếu thông tin ưu tiên cho một vị trí bằng "trẻ ảo" có tên là .priority. Bạn có thể đọc các mức độ ưu tiên bằng GET yêu cầu và viết chúng bằng PUT yêu cầu. Ví dụ: yêu cầu sau đây truy xuất mức độ ưu tiên của Nút users/tom:

curl 'https://[PROJECT_ID].firebaseio/users/tom/.priority.json'

Để ghi mức độ ưu tiên và dữ liệu cùng một lúc, bạn có thể thêm .priority phần tử con với tải trọng JSON:

curl -X PUT -d '{"name": {"first": "Tom"}, ".priority": 1.0}' \
  'https://[PROJECT_ID].firebaseio/users/tom.json'

Để ghi mức độ ưu tiên và giá trị gốc (ví dụ: một chuỗi) cùng một lúc, bạn có thể thêm phần tử con .priority và đặt giá trị gốc trong thành phần con .value:

curl -X PUT -d '{".value": "Tom", ".priority": 1.0}' \
  'https://[PROJECT_ID].firebaseio/users/tom/name/first.json'

Thao tác này ghi "Tom" với mức độ ưu tiên là 1.0. Bạn có thể đưa các mức độ ưu tiên ở mọi độ sâu trong tải trọng JSON.

Giá trị của máy chủ

Bạn có thể ghi các giá trị máy chủ tại một vị trí bằng cách sử dụng giá trị phần giữ chỗ là đối tượng có một khoá .sv duy nhất. Giá trị của khoá đó là loại giá trị máy chủ mà bạn muốn đặt. Ví dụ: như sau yêu cầu đặt giá trị của nút thành giá trị hiện tại của máy chủ Firebase timestamp [dấu_thời_gian]:

curl -X PUT -d '{".sv": "timestamp"}' \
  'https://[PROJECT_ID].firebaseio/users/tom/startedAtTime.json'

Bạn cũng có thể ghi mức độ ưu tiên bằng cách sử dụng các giá trị máy chủ, bằng "trẻ ảo" đường dẫn nêu trên.

Sau đây là các giá trị máy chủ được hỗ trợ:

Giá trị máy chủ
dấu thời gian Thời gian kể từ thời gian bắt đầu của hệ thống UNIX, tính bằng mili giây.
mức tăng Cung cấp một giá trị delta số nguyên hoặc dấu phẩy động dưới dạng { ".sv": {"increment": <delta_value> }}, để xác định theo tỷ lệ làm tăng giá trị cơ sở dữ liệu hiện tại. Nếu chưa có dữ liệu, nội dung cập nhật sẽ đặt dữ liệu cho giá trị delta. Nếu một trong hai giá trị delta hoặc dữ liệu hiện tại là giá trị nổi dấu phẩy động, cả hai giá trị sẽ được hiểu là số thực và áp dụng cho chương trình phụ trợ dưới dạng giá trị kép. Số học kép và cách biểu diễn các giá trị kép tuân theo Ngữ nghĩa của IEEE 754. Nếu có tràn số nguyên dương/âm, tổng sẽ được tính thành kiểu kép.

Đang truy xuất và cập nhật Firebase Realtime Database Security Rules

API REST cũng có thể được dùng để truy xuất và cập nhật Firebase Realtime Database Security Rules cho dự án Firebase của bạn. Bạn sẽ cần mã thông báo bí mật của dự án Firebase. bạn có thể tìm thấy trong Bảng điều khiển Tài khoản dịch vụ trong dự án Firebase của bạn cài đặt.

curl 'https://[PROJECT_ID].firebaseio/.settings/rules.json?auth=FIREBASE_SECRET'
curl -X PUT -d '{ "rules": { ".read": true } }' 'https://[PROJECT_ID].firebaseio/.settings/rules.json?auth=FIREBASE_SECRET'

Xác thực yêu cầu

Theo mặc định, các yêu cầu REST được thực thi mà không cần xác thực và sẽ chỉ thành công nếu Realtime Database Quy tắc cho phép quyền đọc hoặc ghi công khai vào dữ liệu. Để xác thực yêu cầu của bạn, hãy sử dụng Tham số truy vấn access_token= hoặc auth=.

Tìm hiểu thêm về việc xác thực thông qua API REST trong Xác thực yêu cầu REST.

Các điều kiện về lỗi

API REST của cơ sở dữ liệu Firebase có thể trả về các mã lỗi sau.

Mã trạng thái HTTP
400 Yêu cầu không hợp lệ

Một trong các điều kiện lỗi sau:

  • Không thể phân tích cú pháp dữ liệu PUT hoặc POST.
  • Thiếu dữ liệu PUT hoặc POST.
  • Yêu cầu cố gắng PUT hoặc POST dữ liệu quá lớn.
  • Lệnh gọi API REST chứa tên con không hợp lệ trong đường dẫn.
  • Đường dẫn của lệnh gọi API REST quá dài.
  • Yêu cầu có chứa giá trị máy chủ không được nhận dạng.
  • Chỉ mục cho truy vấn không được xác định trong Firebase Realtime Database Security Rules.
  • Yêu cầu không hỗ trợ một trong các tham số truy vấn được chỉ định.
  • Yêu cầu này kết hợp các tham số truy vấn với một yêu cầu GET nông.
401 Không được phép

Một trong các điều kiện lỗi sau:

  • Mã thông báo xác thực đã hết hạn.
  • Mã thông báo xác thực được sử dụng trong yêu cầu không hợp lệ.
  • Không xác thực được bằng access_token.
  • Yêu cầu vi phạm Firebase Realtime Database Security Rules.
404 Không tìm thấy Không tìm thấy Realtime Database được chỉ định.
500 Lỗi máy chủ nội bộ Máy chủ trả về một lỗi. Hãy xem thông báo lỗi để biết thêm chi tiết.
503 Dịch vụ không hoạt động Cơ sở dữ liệu theo thời gian thực của Firebase được chỉ định tạm thời không hoạt động, thì có nghĩa là yêu cầu chưa được thử.
412 Không đáp ứng được điều kiện tiên quyết Giá trị ETag được chỉ định của yêu cầu trong tiêu đề if-match không khớp với giá trị của máy chủ.