Cách tiết kiệm dữ liệu |
|
---|---|
ĐẶT | Ghi hoặc thay thế dữ liệu thành một đường dẫn đã xác định, chẳng hạn như fireblog/users/user1/<data> |
PHÙ HỢP | Cập nhật một số khoá cho đường dẫn đã xác định mà không thay thế tất cả dữ liệu. |
ĐĂNG | Thêm vào danh sách dữ liệu trong cơ sở dữ liệu Firebase của chúng tôi. Mỗi lần chúng ta gửi yêu cầu POST , ứng dụng Firebase sẽ tạo một khoá duy nhất, chẳng hạn như fireblog/users/<unique-id>/<data> |
XÓA | Xoá dữ liệu khỏi tham chiếu cơ sở dữ liệu Firebase được chỉ định. |
Ghi dữ liệu bằng PUT
Thao tác ghi cơ bản thông qua API REST là PUT
. Người nhận
minh hoạ cách tiết kiệm dữ liệu, chúng ta sẽ xây dựng ứng dụng viết blog với bài đăng và người dùng. Tất cả
dữ liệu cho ứng dụng của chúng ta sẽ được lưu trữ trong đường dẫn "fireblog", tại URL cơ sở dữ liệu của Firebase
"https://docs-examples.firebaseio.com/fireblog".
Hãy bắt đầu bằng cách lưu một số dữ liệu người dùng vào cơ sở dữ liệu Firebase của chúng tôi. Chúng tôi sẽ lưu trữ mỗi người dùng theo một
tên người dùng của bạn và chúng tôi cũng sẽ lưu trữ tên đầy đủ và ngày sinh của họ. Vì mỗi người dùng sẽ có một
tên người dùng duy nhất, bạn nên sử dụng PUT
tại đây thay vì POST
vì
chúng tôi đã có khoá và không cần tạo khoá.
Bằng cách sử dụng PUT
, chúng ta có thể ghi một chuỗi, số, boolean, mảng hoặc bất kỳ đối tượng JSON nào vào
cơ sở dữ liệu Firebase của chúng tôi. Trong trường hợp này, chúng ta sẽ truyền cho đối tượng:
curl -X PUT -d '{ "alanisawesome": { "name": "Alan Turing", "birthday": "June 23, 1912" } }' 'https://docs-examples.firebaseio.com/fireblog/users.json'
Khi một đối tượng JSON được lưu vào cơ sở dữ liệu, các thuộc tính của đối tượng sẽ được tự động được ánh xạ tới các vị trí con theo kiểu lồng nhau. Nếu chúng ta đi theo chỉ dẫn vào nút mới tạo, chúng ta sẽ thấy giá trị "Alan Turing". Chúng tôi cũng có thể lưu dữ liệu trực tiếp vào vị trí của trẻ:
curl -X PUT -d '"Alan Turing"' \ 'https://docs-examples.firebaseio.com/fireblog/users/alanisawesome/name.json'
curl -X PUT -d '"June 23, 1912"' \ 'https://docs-examples.firebaseio.com/fireblog/users/alanisawesome/birthday.json'
Hai ví dụ trên – viết giá trị cùng lúc dưới dạng đối tượng và viết giá trị tách biệt với các vị trí con—sẽ dẫn đến việc cùng một dữ liệu được lưu vào Firebase cơ sở dữ liệu:
{ "users": { "alanisawesome": { "date_of_birth": "June 23, 1912", "full_name": "Alan Turing" } } }
Yêu cầu thành công sẽ được biểu thị bằng mã trạng thái HTTP 200 OK
và
sẽ chứa dữ liệu mà chúng tôi đã ghi vào cơ sở dữ liệu. Ví dụ đầu tiên sẽ chỉ
kích hoạt một sự kiện trên các ứng dụng đang xem dữ liệu, trong khi ví dụ thứ hai sẽ kích hoạt
hai. Điều quan trọng cần lưu ý là nếu dữ liệu đã tồn tại trong đường dẫn của người dùng, thì phương pháp đầu tiên
sẽ ghi đè phương thức này, nhưng phương thức thứ hai sẽ chỉ sửa đổi giá trị của từng phần tử con riêng biệt
trong khi vẫn giữ nguyên nút con khác. PUT
tương đương với
set()
trong SDK JavaScript của chúng tôi.
Cập nhật dữ liệu bằng PATCH
Khi sử dụng yêu cầu PATCH
, chúng ta có thể cập nhật một số phần tử con cụ thể tại một vị trí mà không có
ghi đè dữ liệu hiện có. Hãy thêm biệt hiệu của Turing vào dữ liệu người dùng của anh ấy bằng PATCH
yêu cầu:
curl -X PATCH -d '{ "nickname": "Alan The Machine" }' \ 'https://docs-examples.firebaseio.com/fireblog/users/alanisawesome.json'
Yêu cầu ở trên sẽ ghi nickname
vào đối tượng alanisawesome
mà không xoá phần tử con name
hoặc birthday
. Lưu ý rằng nếu chúng ta có
đã đưa ra yêu cầu PUT
tại đây, name
và birthday
sẽ bị xoá do không có trong yêu cầu. Dữ liệu trong Firebase của chúng tôi
cơ sở dữ liệu hiện có dạng như sau:
{ "users": { "alanisawesome": { "date_of_birth": "June 23, 1912", "full_name": "Alan Turing", "nickname": "Alan The Machine" } } }
Yêu cầu thành công sẽ được biểu thị bằng mã trạng thái HTTP 200 OK
và
sẽ chứa dữ liệu đã cập nhật được ghi vào cơ sở dữ liệu.
Firebase cũng hỗ trợ cập nhật theo nhiều đường dẫn. Điều này có nghĩa là PATCH
hiện có thể cập nhật các giá trị ở nhiều vị trí trong cơ sở dữ liệu Firebase cùng một lúc. Đây là một tính năng mạnh mẽ cho phép bạn
huỷ chuẩn hoá dữ liệu của bạn. Khi sử dụng bản cập nhật nhiều đường dẫn, chúng ta có thể thêm biệt hiệu cho cả Alan và Grace cùng một lúc:
curl -X PATCH -d '{ "alanisawesome/nickname": "Alan The Machine", "gracehopper/nickname": "Amazing Grace" }' \ 'https://docs-examples.firebaseio.com/fireblog/users.json'
Sau lần cập nhật này, cả Alan và Grace đều đã thêm biệt hiệu:
{ "users": { "alanisawesome": { "date_of_birth": "June 23, 1912", "full_name": "Alan Turing", "nickname": "Alan The Machine" }, "gracehop": { "date_of_birth": "December 9, 1906", "full_name": "Grace Hopper", "nickname": "Amazing Grace" } } }
Lưu ý rằng việc cố gắng cập nhật đối tượng bằng cách ghi đối tượng có đường dẫn sẽ dẫn đến hành vi khác. Hãy xem điều gì sẽ xảy ra nếu chúng ta cố gắng cập nhật Grace và Alan theo cách này:
curl -X PATCH -d '{ "alanisawesome": {"nickname": "Alan The Machine"}, "gracehopper": {"nickname": "Amazing Grace"} }' \ 'https://docs-examples.firebaseio.com/fireblog/users.json'
Điều này dẫn đến nhiều hành vi khác nhau, cụ thể là ghi đè toàn bộ nút /fireblog/users
:
{ "users": { "alanisawesome": { "nickname": "Alan The Machine" }, "gracehop": { "nickname": "Amazing Grace" } } }
Cập nhật dữ liệu bằng yêu cầu có điều kiện
Bạn có thể sử dụng các yêu cầu có điều kiện (REST tương đương với giao dịch) để cập nhật theo trạng thái hiện có. Cho ví dụ: nếu bạn muốn tăng số lượt tán thành và muốn đảm bảo số lượng phản ánh chính xác nhiều lượt tán thành đồng thời, sử dụng câu lệnh có điều kiện yêu cầu ghi giá trị mới vào bộ đếm. Thay vì ghi hai lần làm thay đổi bộ đếm về cùng một số, một trong các yêu cầu ghi không thành công và thì bạn có thể thử lại yêu cầu với giá trị mới.- Để thực hiện yêu cầu có điều kiện tại một vị trí, hãy lấy giá trị nhận dạng duy nhất
cho dữ liệu hiện tại ở vị trí đó hoặc ETag. Nếu dữ liệu thay đổi ở mức
ở vị trí đó thì ETag cũng thay đổi. Bạn có thể yêu cầu ETag bằng bất kỳ
không phải là
PATCH
. Ví dụ sau đây sử dụng một yêu cầuGET
. Cụ thể, việc gọi ETag trong tiêu đề sẽ trả về ETag của vị trí được chỉ định trong phản hồi HTTP.curl -i 'https://test.example.com/posts/12345/upvotes.json' -H 'X-Firebase-ETag: true'
HTTP/1.1 200 OK Content-Length: 6 Content-Type: application/json; charset=utf-8 Access-Control-Allow-Origin: * ETag: [ETAG_VALUE] Cache-Control: no-cache 10 // Current value of the data at the specified location
- Thêm ETag được trả về vào
PUT
hoặcDELETE
tiếp theo của bạn yêu cầu cập nhật dữ liệu khớp cụ thể với giá trị ETag đó. Theo ví dụ của chúng tôi, để cập nhật bộ đếm lên 11 hoặc 1 lớn hơn giá trị được tìm nạp ban đầu là 10, và không thực hiện được yêu cầu nếu giá trị không còn khớp, hãy sử dụng đoạn mã sau: Nếu giá trị của dữ liệu ở vị trí được chỉ định vẫn là 10, thì ETag trong Yêu cầucurl -iX PUT -d '11' 'https://[PROJECT_ID].firebaseio.com/posts/12345/upvotes.json' -H 'if-match:[ETAG_VALUE]'
PUT
khớp và yêu cầu thành công, ghi 11 vào cơ sở dữ liệu. Nếu vị trí không còn khớp với ETag đó, điều này có thể xảy ra nếu một người dùng khác đã ghi một giá trị mới vào cơ sở dữ liệu, yêu cầu sẽ không thành công nếu không ghi vào cơ sở dữ liệu vị trí. Phản hồi trả lại hàng bao gồm giá trị mới và ETag.HTTP/1.1 200 OK Content-Length: 6 Content-Type: application/json; charset=utf-8 Access-Control-Allow-Origin: * Cache-Control: no-cache 11 // New value of the data at the specified location, written by the conditional request
HTTP/1.1 412 Precondition Failed Content-Length: 6 Content-Type: application/json; charset=utf-8 Access-Control-Allow-Origin: * ETag: [ETAG_VALUE] Cache-Control: no-cache 12 // New value of the data at the specified location
- Hãy sử dụng thông tin mới nếu bạn quyết định thử yêu cầu lại. Realtime Database không tự động thử lại các yêu cầu có điều kiện không thực hiện được. Tuy nhiên, bạn có thể sử dụng giá trị mới và ETag để tạo một yêu cầu có điều kiện mới bằng thông tin được trả về bởi phản hồi không thành công.
Các yêu cầu có điều kiện dựa trên REST triển khai HTTP nếu-khớp chuẩn. Tuy nhiên, chúng khác với tiêu chuẩn ở những điểm sau:
- Bạn chỉ có thể cung cấp một giá trị ETag cho từng yêu cầu nếu khớp, chứ không được cung cấp nhiều giá trị.
- Mặc dù tiêu chuẩn đề xuất trả về ETag với tất cả các yêu cầu,
Cơ sở dữ liệu theo thời gian thực chỉ trả về ETag với các yêu cầu bao gồm
Tiêu đề
X-Firebase-ETag
. Điều này giúp giảm chi phí thanh toán cho các yêu cầu thông thường.
Yêu cầu có điều kiện cũng có thể chậm hơn so với các yêu cầu REST thông thường.
Đang lưu danh sách dữ liệu
Để tạo một khoá duy nhất dựa trên dấu thời gian cho mỗi thành phần con được thêm vào tệp tham chiếu cơ sở dữ liệu Firebase
chúng tôi có thể gửi một yêu cầu POST
. Đối với lộ trình users
, chúng ta nên
xác định khoá của riêng mình vì mỗi người dùng có một tên người dùng duy nhất. Nhưng khi người dùng thêm bài đăng trên blog vào
, chúng tôi sẽ sử dụng yêu cầu POST
để tự động tạo khoá cho mỗi bài đăng trên blog:
curl -X POST -d '{ "author": "alanisawesome", "title": "The Turing Machine" }' 'https://docs-examples.firebaseio.com/fireblog/posts.json'
Đường dẫn posts
của chúng ta hiện có dữ liệu sau:
{ "posts": { "-JSOpn9ZC54A4P4RoqVa": { "author": "alanisawesome", "title": "The Turing Machine" } } }
Xin lưu ý rằng khoá -JSOpn9ZC54A4P4RoqVa
đã được tạo tự động cho chúng ta vì
chúng tôi đã sử dụng yêu cầu POST
. 200 OK
sẽ biểu thị yêu cầu thành công
Mã trạng thái HTTP và phản hồi sẽ chứa khoá của dữ liệu mới đã được thêm vào:
{"name":"-JSOpn9ZC54A4P4RoqVa"}
Xoá dữ liệu
Để xoá dữ liệu khỏi cơ sở dữ liệu, chúng ta có thể gửi yêu cầu DELETE
kèm theo
URL của đường dẫn mà chúng tôi muốn xoá dữ liệu. Thao tác sau sẽ xoá Alan khỏi
Đường dẫn users
:
curl -X DELETE \ 'https://docs-examples.firebaseio.com/fireblog/users/alanisawesome.json'
Yêu cầu DELETE
thành công sẽ được biểu thị bằng mã trạng thái HTTP 200 OK
có phản hồi chứa JSON null
.
Tham số URI
API REST chấp nhận các tham số URI sau đây khi ghi dữ liệu vào cơ sở dữ liệu:
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ằng
Firebase Realtime Database Security Rules và là
được tất cả các loại yêu cầu hỗ trợ. Đối số có thể là mã thông báo bí mật của ứng dụng Firebase hoặc
mã thông báo xác thực mà chúng tôi sẽ đề cập trong phần uỷ quyền người dùng
. Trong ví dụ sau, chúng ta gửi yêu cầu POST
kèm theo
Tham số auth
, trong đó CREDENTIAL
là mã thông báo bí mật của ứng dụng Firebase hoặc
mã thông báo xác thực:
curl -X POST -d '{"Authenticated POST request"}' \ 'https://docs-examples.firebaseio.com/auth-example.json?auth=CREDENTIAL'
in
Tham số print
cho phép chúng ta chỉ định định dạng của phản hồi từ
cơ sở dữ liệu. Việc thêm print=pretty
vào yêu cầu của chúng ta sẽ trả về dữ liệu trong một
ở định dạng mà con người có thể đọc được. print=pretty
được hỗ trợ bởi GET
,
Yêu cầu PUT
, POST
, PATCH
và DELETE
.
Để loại bỏ dữ liệu đầu ra từ máy chủ khi ghi dữ liệu, chúng ta có thể thêm
print=silent
vào yêu cầu của chúng ta. 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
nếu yêu cầu thành công.
print=silent
được hỗ trợ bởi GET
, PUT
,
POST
và PATCH
yêu cầu.
Ghi giá trị máy chủ
Bạn có thể viết 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"
. Giá trị cho khoá đó là loại giá trị máy chủ mà chúng ta muốn đặt.
Ví dụ: để đặt dấu thời gian khi tạo một người dùng, chúng ta có thể làm như sau:
curl -X PUT -d '{".sv": "timestamp"}' \ 'https://docs-examples.firebaseio.com/alanisawesome/createdAt.json'
"timestamp"
là giá trị máy chủ duy nhất được hỗ trợ và là thời gian kể từ khi UNIX
thời gian bắt đầu của hệ thống tính bằng mili giây.
Cải thiện hiệu suất ghi
Nếu ghi một lượng lớn dữ liệu vào cơ sở dữ liệu, chúng ta có thể sử dụng
Tham số print=silent
để cải thiện hiệu suất ghi và giảm băng thông
mức sử dụng. Ở hành vi ghi thông thường, máy chủ sẽ phản hồi bằng dữ liệu JSON đã ghi.
Khi bạn chỉ định print=silent
, máy chủ sẽ ngay lập tức
đóng kết nối sau khi nhận được dữ liệu, giảm mức sử dụng băng thông.
Trong trường hợp chúng ta tạo nhiều yêu cầu đến cơ sở dữ liệu, chúng ta có thể sử dụng lại HTTPS
bằng cách gửi yêu cầu Keep-Alive
trong tiêu đề HTTP.
Các điều kiện về lỗi
API REST sẽ trả về mã lỗi trong những trường hợp 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:
|
401 Không được phép |
Một trong các điều kiện lỗi sau:
|
404 Không tìm thấy | Không tìm thấy cơ sở dữ liệu Firebase đượ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 đã chỉ định tạm thời không hoạt động, điều này có nghĩa là chưa gửi yêu cầu. |
Bảo mật dữ liệu
Firebase có một ngôn ngữ bảo mật cho phép chúng ta xác định những người dùng có quyền đọc và ghi các nút khác nhau của dữ liệu. Bạn có thể đọc thêm về vấn đề này trong Realtime Database Security Rules.
Bây giờ, chúng ta đã đề cập đến cách lưu dữ liệu, chúng ta có thể tìm hiểu cách truy xuất dữ liệu từ Firebase cơ sở dữ liệu thông qua API REST trong phần tiếp theo.