Tiết kiệm dữ liệu

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

Cách lưu dữ liệu

ĐẶT Ghi hoặc thay thế dữ liệu vào một đường dẫn xác định , như fireblog/users/user1/<data>
Cập nhật một số khóa cho một đường dẫn xác định mà không cần thay thế tất cả dữ liệu.
BƯU KIỆN 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 khi chúng tôi gửi yêu cầu POST , ứng dụng khách Firebase sẽ tạo một khóa duy nhất, như fireblog/users/<unique-id>/<data>
XÓA BỎ Xóa dữ liệu khỏi tham chiếu cơ sở dữ liệu Firebase đã chỉ định.

Ghi dữ liệu bằng PUT

Thao tác ghi cơ bản thông qua API REST là PUT . Để tiết kiệm dữ liệu, chúng tôi sẽ xây dựng một ứng dụng viết blog với các bài đăng và người dùng. Tất cả dữ liệu cho ứng dụng của chúng tôi sẽ được lưu trữ theo đường dẫn của `fireblog`, tại URL cơ sở dữ liệu 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 bằng một tên người dùng duy nhất 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, nên sử dụng PUT ở đây thay vì POST vì chúng ta đã có khóa và không cần tạo.

Sử dụng PUT , chúng tôi có thể viết 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 tôi sẽ chuyển nó một đố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ẽ tự động được ánh xạ tới các vị trí con theo kiểu lồng nhau. Nếu chúng ta điều hướng đến nút mới được 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í con:

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 — ghi giá trị cùng lúc với một đối tượng và ghi chúng riêng biệt vào các vị trí con — sẽ dẫn đến việc lưu cùng một dữ liệu vào cơ sở dữ liệu Firebase của chúng tôi:

{
  "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à phản hồi sẽ chứa dữ liệu 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 khách hàng đang xem dữ liệu, trong khi ví dụ thứ hai sẽ kích hoạt hai sự kiện. Điều quan trọng cần lưu ý là nếu dữ liệu đã tồn tại ở đường dẫn người dùng, cách tiếp cận đầu tiên sẽ ghi đè lên nó, nhưng phương pháp thứ hai sẽ chỉ sửa đổi giá trị của từng nút con riêng biệt trong khi vẫn giữ nguyên các 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 với PATCH

Sử dụng yêu cầu PATCH , chúng tôi có thể cập nhật các trẻ cụ thể tại một vị trí mà không 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 với yêu cầu PATCH :

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 của chúng tôi mà không xóa name hoặc birthday trẻ em. Lưu ý rằng nếu chúng tôi đã đưa ra yêu cầu PUT ở đây, namebirthday sẽ bị xóa vì chúng không được đưa vào yêu cầu. Dữ liệu trong cơ sở dữ liệu Firebase của chúng tôi hiện trông giố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à phản hồi 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 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ị tại nhiều vị trí trong cơ sở dữ liệu Firebase của bạn cùng một lúc, một tính năng mạnh mẽ cho phép giúp bạn chuẩn hóa dữ liệu của mình . Bằng cách sử dụng cập nhật nhiều đường dẫn, chúng tôi 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 bản cập nhật này, cả Alan và Grace đã được thêm biệt danh của họ:

{
  "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 các đối tượng bằng cách ghi các đối tượng với các đường dẫn đi kèm sẽ dẫn đến các hành vi khác nhau. Hãy xem điều gì sẽ xảy ra nếu thay vào đó 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 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 với các 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 các giao dịch, để cập nhật dữ liệu theo trạng thái hiện có của nó. Ví dụ: nếu bạn muốn tăng bộ đếm lượt ủng hộ và muốn đảm bảo số lượng phản ánh chính xác nhiều lượt ủng hộ đồng thời, hãy sử dụng yêu cầu có điều kiện để ghi giá trị mới vào bộ đếm. Thay vì hai lần ghi thay đổi bộ đếm thành cùng một số, một trong các yêu cầu ghi không thành công và sau đó bạn có thể thử lại yêu cầu với giá trị mới.
  1. Để thực hiện yêu cầu có điều kiện tại một vị trí, hãy lấy số nhận dạng duy nhất cho dữ liệu hiện tại tại vị trí đó hoặc ETag. Nếu dữ liệu thay đổi tại vị trí đó, ETag cũng thay đổi theo. Bạn có thể yêu cầu ETag bằng bất kỳ phương thức nào khác ngoài PATCH . Ví dụ sau sử dụng yêu cầu GET .
    curl -i 'https://test.example.com/posts/12345/upvotes.json' -H 'X-Firebase-ETag: true'
    
    Cụ thể việc gọi ETag trong tiêu đề trả về ETag của vị trí được chỉ định trong phản hồi HTTP.
    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
    
  2. Bao gồm ETag được trả lại trong yêu cầu PUT hoặc DELETE tiếp theo của bạn để 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 lớn hơn 1 so với 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 nữa, hãy sử dụng mã sau:
    curl -iX PUT -d '11' 'https://[PROJECT_ID].firebaseio.com/posts/12345/upvotes.json' -H 'if-match:[ETAG_VALUE]'
    
    Nếu giá trị của dữ liệu ở mức được chỉ định vị trí vẫn là 10, thẻ ETag trong yêu cầu PUT khớp và yêu cầu thành công, ghi 11 vào cơ sở dữ liệu.
    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
    
    Nếu vị trí không còn khớp với ETag, điều này có thể xảy ra nếu người dùng khác ghi giá trị mới vào cơ sở dữ liệu, yêu cầu không thành công mà không ghi vào vị trí. Phản hồi trả về bao gồm giá trị mới và ETag.
    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
    
  3. Sử dụng thông tin mới nếu bạn quyết định thử lại yêu cầu. Cơ sở dữ liệu thời gian thực không tự động thử lại các yêu cầu có điều kiện không thành công. 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 với 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 tiêu chuẩn nếu đối sánh HTTP. Tuy nhiên, chúng khác với tiêu chuẩn theo những cách sau:

  • Bạn chỉ có thể cung cấp một giá trị ETag cho mỗi yêu cầu nếu khớp, không phải nhiều.
  • Trong khi tiêu chuẩn đề xuất rằng ETags được trả lại với tất cả các yêu cầu, Cơ sở dữ liệu thời gian thực chỉ trả về ETags với các yêu cầu bao gồm tiêu đề X-Firebase-ETag . Điều này làm giảm chi phí thanh toán cho các yêu cầu tiêu chuẩn.

Các yêu cầu có điều kiện cũng có thể chậm hơn các yêu cầu REST thông thường.

Lưu danh sách dữ liệu

Để tạo một khóa dựa trên dấu thời gian, duy nhất cho mọi phần tử con được thêm vào tham chiếu cơ sở dữ liệu Firebase, chúng tôi có thể gửi yêu cầu POST . Đối với đường dẫn users của chúng tôi, thật hợp lý khi xác định các khóa của riêng chúng tôi 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 các bài đăng trên blog vào ứng dụng, chúng tôi sẽ sử dụng yêu cầu POST để tự động tạo khóa 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 tôi hiện có dữ liệu sau:

{
  "posts": {
    "-JSOpn9ZC54A4P4RoqVa": {
      "author": "alanisawesome",
      "title": "The Turing Machine"
    }
  }
}

Lưu ý rằng khóa -JSOpn9ZC54A4P4RoqVa được tạo tự động cho chúng tôi vì chúng tôi đã sử dụng yêu cầu POST . 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 khóa của dữ liệu mới đã được thêm vào:

{"name":"-JSOpn9ZC54A4P4RoqVa"}

Xóa dữ liệu

Để xóa dữ liệu khỏi cơ sở dữ liệu, chúng tôi 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 xóa dữ liệu. Những điều sau sẽ xóa Alan khỏi đường dẫn users của chúng tôi:

curl -X DELETE \
  'https://docs-examples.firebaseio.com/fireblog/users/alanisawesome.json'

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

Tham số URI

API REST chấp nhận các tham số URI sau khi ghi dữ liệu vào cơ sở dữ liệu:

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 ứng dụng Firebase của chúng tôi hoặc mã thông báo xác thực mà chúng tôi sẽ đề cập trong phần ủy quyền người dùng . Trong ví dụ sau, chúng tôi gửi một yêu cầu POST kèm theo thông số auth , trong đó CREDENTIAL là bí mật ứng dụng Firebase của chúng tôi 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 tôi chỉ định định dạng phản hồi của chúng tôi từ cơ sở dữ liệu. Thêm print=pretty vào yêu cầu của chúng tôi sẽ trả về dữ liệu ở định dạng con người có thể đọc được. print=pretty được hỗ trợ bởi các yêu cầu GET , PUT , POST , PATCHDELETE .

Để ngăn chặn đầ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 mình. Phản hồi kết quả 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 các yêu cầu GET , PUT , POSTPATCH .

Viết giá trị máy chủ

Giá trị máy chủ có thể được ghi tại một vị trí bằng cách sử dụng giá trị trình giữ chỗ, là một đối tượng có một khóa ".sv" . Giá trị cho khóa đó là loại giá trị máy chủ mà chúng tôi muốn đặt. Ví dụ: để đặt dấu thời gian khi người dùng được tạo, 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ừ kỷ nguyên UNIX tính bằng mili giây.

Cải thiện hiệu suất ghi

Nếu chúng ta đang 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 mức sử dụng băng thông. Trong hành vi ghi bình thường, máy chủ phản hồi với dữ liệu JSON đã được ghi. Khi 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, làm giảm việc sử dụng băng thông.

Trong trường hợp chúng tôi đưa ra nhiều yêu cầu đối với cơ sở dữ liệu, chúng tôi có thể sử dụng lại kết nối HTTPS bằng cách gửi yêu cầu Keep-Alive trong tiêu đề HTTP.

Điều kiện 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:

  • 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 REST API chứa các tên con không hợp lệ như một phần của đường dẫn.
  • Đường dẫn lệnh gọi API REST quá dài.
  • Yêu cầu chứa một giá trị máy chủ không được công nhận.
  • Chỉ mục cho truy vấn không được xác định trong Quy tắc cơ sở dữ liệu thời gian thực Firebase của bạn.
  • 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 kết hợp các tham số truy vấn với một yêu cầu GET nông.
401 trái 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 đã chỉ định.
500 Lỗi máy chủ nội bộ Máy chủ trả về lỗi. Xem thông báo lỗi để biết thêm chi tiết.
503 Dịch vụ không khả dụng Cơ sở dữ liệu thời gian thực của Firebase được chỉ định tạm thời không khả dụng, có nghĩa là yêu cầu không được thực hiện.

Bảo mật dữ liệu

Firebase có ngôn ngữ bảo mật cho phép chúng tôi xác định người dùng nào có quyền truy cập đọc và ghi vào các nút khác nhau trong dữ liệu của chúng tôi. Bạn có thể đọc thêm về nó trong Quy tắc cơ sở dữ liệu thời gian thực .

Bây giờ chúng ta đã đề cập đến việc lưu dữ liệu, chúng ta có thể tìm hiểu cách truy xuất dữ liệu của mình từ cơ sở dữ liệu Firebase thông qua API REST trong phần tiếp theo.