บันทึกข้อมูล

วิธีบันทึกข้อมูล

PUT เขียนหรือเปลี่ยนข้อมูลไปยังเส้นทางที่กำหนดไว้เช่น fireblog/users/user1/<data>
ปะ อัปเดตคีย์บางคีย์สำหรับพาธที่กำหนดโดยไม่ต้องแทนที่ข้อมูลทั้งหมด
โพสต์ เพิ่มในรายการของข้อมูลในฐานข้อมูลของเรา Firebase เวลาที่เราส่งทุก POST คำขอไคลเอ็นต์ Firebase สร้างคีย์ที่ไม่ซ้ำกันเช่น fireblog/users/<unique-id>/<data>
ลบ ลบข้อมูลจากการอ้างอิงฐานข้อมูล Firebase ที่ระบุ

การเขียนข้อมูลด้วย PUT

การเขียนขั้นพื้นฐานผ่าน REST API เป็น PUT เพื่อแสดงการบันทึกข้อมูล เราจะสร้างแอปพลิเคชันบล็อกที่มีโพสต์และผู้ใช้ ข้อมูลทั้งหมดสำหรับแอปพลิเคชันของเราจะถูกเก็บไว้ภายใต้เส้นทางของ "fireblog" ที่ URL ฐานข้อมูล Firebase "https://docs-examples.firebaseio.com/fireblog"

เริ่มต้นด้วยการบันทึกข้อมูลผู้ใช้บางส่วนลงในฐานข้อมูล Firebase ของเรา เราจะจัดเก็บผู้ใช้แต่ละคนด้วยชื่อผู้ใช้ที่ไม่ซ้ำกัน และเราจะจัดเก็บชื่อเต็มและวันเกิดของพวกเขาด้วย เนื่องจากผู้ใช้แต่ละคนจะมีชื่อผู้ใช้ที่ไม่ซ้ำกันก็จะทำให้ความรู้สึกที่จะใช้ PUT นี่แทน POST ตั้งแต่ที่เรามีอยู่แล้วที่สำคัญและไม่จำเป็นต้องสร้าง

ใช้ PUT เราสามารถเขียนสตริงจำนวนบูลอาร์เรย์หรือวัตถุ JSON ใด ๆ ไปยังฐานข้อมูลของเรา Firebase ในกรณีนี้ เราจะส่งต่อวัตถุ:

curl -X PUT -d '{
  "alanisawesome": {
    "name": "Alan Turing",
    "birthday": "June 23, 1912"
  }
}' 'https://docs-examples.firebaseio.com/fireblog/users.json'

เมื่ออ็อบเจ็กต์ JSON ถูกบันทึกลงในฐานข้อมูล คุณสมบัติอ็อบเจ็กต์จะถูกแมปโดยอัตโนมัติกับตำแหน่งย่อยในลักษณะที่ซ้อนกัน หากเรานำทางไปยังโหนดที่สร้างขึ้นใหม่ เราจะเห็นค่า "Alan Turing" นอกจากนี้เรายังสามารถบันทึกข้อมูลไปยังตำแหน่งย่อยได้โดยตรง:

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'

ตัวอย่างสองตัวอย่างข้างต้น—เขียนค่าพร้อมกันเป็นวัตถุและเขียนแยกกันไปยังตำแหน่งย่อย—จะส่งผลให้ข้อมูลเดียวกันถูกบันทึกลงในฐานข้อมูล Firebase ของเรา:

{
  "users": {
    "alanisawesome": {
      "date_of_birth": "June 23, 1912",
      "full_name": "Alan Turing"
    }
  }
}

คำขอที่ประสบความสำเร็จจะถูกระบุโดย 200 OK รหัสสถานะ HTTP และการตอบสนองจะมีข้อมูลที่เราเขียนไปยังฐานข้อมูล ตัวอย่างแรกจะทริกเกอร์เหตุการณ์เดียวในไคลเอนต์ที่กำลังดูข้อมูล ในขณะที่ตัวอย่างที่สองจะทริกเกอร์สองเหตุการณ์ สิ่งสำคัญคือต้องสังเกตว่าหากมีข้อมูลที่พาธผู้ใช้อยู่แล้ว วิธีแรกจะเขียนทับข้อมูลนั้น แต่วิธีที่สองจะแก้ไขเฉพาะค่าของโหนดย่อยที่แยกจากกันโดยที่ปล่อยให้โหนดย่อยอื่นๆ ไม่เปลี่ยนแปลง PUT เทียบเท่ากับ set() ใน SDK JavaScript ของเรา

กำลังอัปเดตข้อมูลด้วย PATCH

ใช้ PATCH การร้องขอเราสามารถอัปเดตสำหรับเด็กโดยเฉพาะในสถานที่ที่ไม่มีการเขียนทับข้อมูลที่มีอยู่ ให้เพิ่มชื่อเล่นทัวริงข้อมูลของผู้ใช้ของเขาด้วย PATCH คำขอ:

curl -X PATCH -d '{
  "nickname": "Alan The Machine"
}' \
  'https://docs-examples.firebaseio.com/fireblog/users/alanisawesome.json'

คำขอดังกล่าวข้างต้นจะเขียน nickname ของเรา alanisawesome วัตถุโดยไม่ต้องลบ name หรือ birthday เด็ก โปรดทราบว่าถ้าเราได้ออก PUT คำขอที่นี่แทน name และ birthday จะได้รับการลบเนื่องจากพวกเขาไม่ได้ถูกรวมในคำขอ ข้อมูลในฐานข้อมูล Firebase ของเราตอนนี้มีลักษณะดังนี้:

{
  "users": {
    "alanisawesome": {
      "date_of_birth": "June 23, 1912",
      "full_name": "Alan Turing",
      "nickname": "Alan The Machine"
    }
  }
}

คำขอที่ประสบความสำเร็จจะถูกระบุโดย 200 OK รหัสสถานะ HTTP และการตอบสนองจะมีการปรับปรุงข้อมูลที่เขียนไปยังฐานข้อมูล

Firebase ยังรองรับการอัปเดตหลายเส้นทาง ซึ่งหมายความว่า PATCH ในขณะนี้สามารถปรับปรุงค่าในสถานที่หลายแห่งในฐานข้อมูล Firebase ของคุณในเวลาเดียวกันคุณลักษณะที่มีประสิทธิภาพซึ่งจะช่วยให้ช่วยให้คุณ denormalize ข้อมูลของคุณ การใช้การอัปเดตหลายเส้นทาง เราสามารถเพิ่มชื่อเล่นให้กับทั้ง Alan และ Grace ได้พร้อมกัน:

curl -X PATCH -d '{
  "alanisawesome/nickname": "Alan The Machine",
  "gracehopper/nickname": "Amazing Grace"
}' \
  'https://docs-examples.firebaseio.com/fireblog/users.json'

หลังจากอัปเดตนี้ ทั้ง Alan และ Grace ได้เพิ่มชื่อเล่นของพวกเขาแล้ว:

{
  "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"
    }
  }
}

โปรดทราบว่าการพยายามอัปเดตออบเจ็กต์โดยการเขียนออบเจ็กต์ที่มีพาธรวมอยู่ด้วยจะส่งผลให้มีการทำงานที่แตกต่างกัน มาดูกันว่าจะเกิดอะไรขึ้นหากเราพยายามอัปเดตเกรซและอลันด้วยวิธีนี้:

curl -X PATCH -d '{
  "alanisawesome": {"nickname": "Alan The Machine"},
  "gracehopper": {"nickname": "Amazing Grace"}
}' \
  'https://docs-examples.firebaseio.com/fireblog/users.json'

ผลนี้ในการทำงานที่แตกต่างกันกล่าวคือแทนที่ทั้งหมด /fireblog/users โหนด:

{
  "users": {
    "alanisawesome": {
      "nickname": "Alan The Machine"
    },
    "gracehop": {
      "nickname": "Amazing Grace"
    }
  }
}

การอัปเดตข้อมูลด้วยคำขอแบบมีเงื่อนไข

คุณสามารถใช้คำขอแบบมีเงื่อนไข REST ที่เทียบเท่ากับธุรกรรม เพื่ออัปเดตข้อมูลตามสถานะที่มีอยู่ ตัวอย่างเช่น หากคุณต้องการเพิ่มตัวนับการโหวตเห็นด้วย และต้องการให้แน่ใจว่าการนับนั้นสะท้อนการโหวตเห็นด้วยหลายครั้งได้อย่างแม่นยำ ให้ใช้คำขอแบบมีเงื่อนไขเพื่อเขียนค่าใหม่ไปยังตัวนับ แทนที่จะเขียนสองครั้งที่เปลี่ยนตัวนับเป็นตัวเลขเดียวกัน คำขอเขียนรายการใดรายการหนึ่งล้มเหลว และคุณสามารถลองคำขออีกครั้งด้วยค่าใหม่
  1. ในการดำเนินการขอแบบมีเงื่อนไขที่สถานที่ ให้รับตัวระบุเฉพาะสำหรับข้อมูลปัจจุบันที่ตำแหน่งนั้น หรือ ETag หากข้อมูลเปลี่ยนแปลงที่ตำแหน่งนั้น ETag จะเปลี่ยนไปด้วย คุณสามารถขอใช้ ETag ด้วยวิธีการอื่น ๆ กว่าใด ๆ PATCH ตัวอย่างต่อไปนี้ใช้ GET คำขอ
    curl -i 'https://test.example.com/posts/12345/upvotes.json' -H 'X-Firebase-ETag: true'
    
    โดยเฉพาะการเรียก ETag ในส่วนหัวกลับ ETag ของสถานที่ที่ระบุในการตอบสนองของ 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. รวม ETag กลับมาในครั้งต่อไปของคุณ PUT หรือ DELETE การร้องขอเพื่อปรับปรุงข้อมูลที่เฉพาะตรงว่าค่า ETag ต่อไปนี้ตัวอย่างของเราในการปรับปรุงเคาน์เตอร์ถึง 11 หรือ 1 มีขนาดใหญ่กว่าค่าความจริงเริ่มต้นของ 10 และล้มเหลวในการร้องขอถ้าค่าไม่มีการแข่งขันอีกต่อไปใช้รหัสต่อไปนี้:
    curl -iX PUT -d '11' 'https://[PROJECT_ID].firebaseio.com/posts/12345/upvotes.json' -H 'if-match:[ETAG_VALUE]'
    
    ถ้าค่าของข้อมูลที่ระบุ สถานที่ยังคงเป็น 10 ETag ในที่ PUT ตรงกับคำขอและขอสำเร็จการเขียน 11 ไปยังฐานข้อมูล
    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
    
    หากสถานที่ไม่ตรงกับ ETag ซึ่งอาจเกิดขึ้นหากผู้ใช้คนอื่นเขียนค่าใหม่ไปยังฐานข้อมูลการร้องขอล้มเหลวโดยไม่ต้องเขียนไปยังตำแหน่งที่ การตอบกลับประกอบด้วยค่าใหม่และ 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. ใช้ข้อมูลใหม่หากคุณตัดสินใจที่จะลองส่งคำขออีกครั้ง ฐานข้อมูลเรียลไทม์ไม่ลองส่งคำขอแบบมีเงื่อนไขที่ล้มเหลวอีกครั้งโดยอัตโนมัติ อย่างไรก็ตาม คุณสามารถใช้ค่าใหม่และ ETag เพื่อสร้างคำขอแบบมีเงื่อนไขใหม่ด้วยข้อมูลที่ส่งคืนโดยการตอบสนองที่ล้มเหลว

ส่วนที่เหลือตามคำขอเงื่อนไขการดำเนินการของ HTTP ถ้าการแข่งขัน มาตรฐาน อย่างไรก็ตาม แตกต่างจากมาตรฐานในลักษณะต่อไปนี้:

  • คุณสามารถระบุค่า ETag ได้เพียงค่าเดียวสำหรับคำขอ if-match แต่ละรายการเท่านั้น ไม่สามารถระบุได้หลายค่า
  • ในขณะที่มาตรฐานแสดงให้เห็นว่า ETags จะกลับมาพร้อมกับคำขอทั้งหมด Realtime ฐานข้อมูลผลตอบแทนเพียง ETags ที่มีการร้องขอรวมทั้ง X-Firebase-ETag ส่วนหัว ซึ่งจะช่วยลดต้นทุนการเรียกเก็บเงินสำหรับคำขอมาตรฐาน

คำขอแบบมีเงื่อนไขอาจช้ากว่าคำขอ REST ทั่วไป

การบันทึกรายการข้อมูล

เพื่อสร้างเอกลักษณ์ที่สำคัญการประทับเวลาที่ใช้สำหรับเด็กเพิ่มไปยังฐานข้อมูลอ้างอิง Firebase ทุกครั้งที่เราสามารถส่ง POST คำขอ สำหรับเรา users เส้นทางมันทำให้รู้สึกในการกำหนดคีย์ของเราเองตั้งแต่ผู้ใช้แต่ละคนมีชื่อผู้ใช้ที่ไม่ซ้ำกัน แต่เมื่อผู้ใช้เพิ่มบล็อกโพสต์ไปยังแอปเราจะใช้ POST การร้องขอไปยังอัตโนมัติสร้างที่สำคัญสำหรับการโพสต์บล็อกแต่ละ:

curl -X POST -d '{
  "author": "alanisawesome",
  "title": "The Turing Machine"
}' 'https://docs-examples.firebaseio.com/fireblog/posts.json'

เรา posts เส้นทางขณะนี้มีข้อมูลต่อไปนี้:

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

แจ้งให้ทราบว่ามีคีย์ -JSOpn9ZC54A4P4RoqVa ถูกสร้างขึ้นโดยอัตโนมัติสำหรับเราเพราะเราใช้ POST คำขอ คำขอที่ประสบความสำเร็จจะถูกระบุโดย 200 OK รหัสสถานะ HTTP และการตอบสนองจะมีที่สำคัญของข้อมูลใหม่ที่ถูกเพิ่มเข้ามานี้

{"name":"-JSOpn9ZC54A4P4RoqVa"}

การลบข้อมูล

ในการลบข้อมูลจากฐานข้อมูลที่เราสามารถส่ง DELETE คำขอที่มี URL ของเส้นทางจากที่เราต้องการที่จะลบข้อมูล ต่อไปนี้จะลบ Alan จากเรา users เส้นทาง:

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

ที่ประสบความสำเร็จ DELETE คำขอจะถูกระบุโดย 200 OK รหัสสถานะ HTTP กับการตอบสนองที่มี JSON null

พารามิเตอร์ URI

REST API ยอมรับพารามิเตอร์ URI ต่อไปนี้เมื่อเขียนข้อมูลไปยังฐานข้อมูล:

รับรองความถูกต้อง

auth พารามิเตอร์คำขอช่วยให้สามารถเข้าถึงข้อมูลการป้องกันโดย Firebase เรียลไทม์กฎฐานข้อมูล และการสนับสนุนจากทุกประเภทคำขอ อาร์กิวเมนต์สามารถเป็นได้ทั้งความลับของเรา Firebase แอปหรือโทเค็นการรับรองความถูกต้องซึ่งเราจะครอบคลุมใน ส่วนการอนุญาตผู้ใช้ ในตัวอย่างต่อไปนี้เราส่ง POST คำขอด้วยการ auth พารามิเตอร์ที่ CREDENTIAL เป็นทั้งแอพพลิเค Firebase ลับหรือการตรวจสอบโทเค็นของเรา:

curl -X POST -d '{"Authenticated POST request"}' \
  'https://docs-examples.firebaseio.com/auth-example.json?auth=CREDENTIAL'

พิมพ์

print พารามิเตอร์ช่วยให้เราระบุรูปแบบของการตอบสนองของเราจากฐานข้อมูล การเพิ่ม print=pretty การร้องขอของเราจะแสดงข้อมูลในรูปแบบของมนุษย์ที่สามารถอ่านได้ print=pretty รับการสนับสนุนโดย GET , PUT , POST , PATCH และ DELETE ร้องขอ

เพื่อให้การปราบปรามการส่งออกจากเซิร์ฟเวอร์เมื่อเขียนข้อมูลเราสามารถเพิ่ม print=silent ต่อการร้องขอของเรา การตอบสนองที่เกิดจะว่างเปล่าและระบุโดย 204 No Content รหัสสถานะ HTTP ถ้าขอเป็นที่ประสบความสำเร็จ print=silent ได้รับการสนับสนุนโดย GET , PUT , POST และ PATCH ร้องขอ

การเขียนค่าเซิร์ฟเวอร์

ค่าเซิร์ฟเวอร์สามารถเขียนได้ที่สถานที่ที่ใช้ค่าตัวยึดซึ่งเป็นวัตถุที่มีเดียว ".sv" ที่สำคัญ ค่าสำหรับคีย์นั้นเป็นประเภทของค่าเซิร์ฟเวอร์ที่เราต้องการตั้งค่า ตัวอย่างเช่น ในการตั้งค่าการประทับเวลาเมื่อสร้างผู้ใช้ เราสามารถทำได้ดังต่อไปนี้:

curl -X PUT -d '{".sv": "timestamp"}' \
  'https://docs-examples.firebaseio.com/alanisawesome/createdAt.json'

"timestamp" เป็นค่าเซิร์ฟเวอร์สนับสนุนเท่านั้นและเป็นเวลาตั้งแต่ยุคยูนิกซ์เป็นมิลลิวินาที

ปรับปรุงประสิทธิภาพการเขียน

ถ้าเรากำลังเขียนข้อมูลจำนวนมากไปยังฐานข้อมูลเราสามารถใช้ print=silent พารามิเตอร์เพื่อปรับปรุงประสิทธิภาพการเขียนและการลดลงของการใช้แบนด์วิธของเรา ในลักษณะการเขียนปกติ เซิร์ฟเวอร์ตอบสนองด้วยข้อมูล JSON ที่เขียนขึ้น เมื่อ print=silent ระบุเซิร์ฟเวอร์ทันทีปิดการเชื่อมต่อหนึ่งครั้งข้อมูลจะได้รับการลดการใช้แบนด์วิดธ์

ในกรณีที่เรากำลังทำร้องขอหลายไปยังฐานข้อมูลที่เราสามารถกลับมาใช้การเชื่อมต่อแบบ HTTPS โดยการส่ง Keep-Alive คำขอในส่วนหัว HTTP

เงื่อนไขข้อผิดพลาด

REST API จะส่งคืนรหัสข้อผิดพลาดภายใต้สถานการณ์เหล่านี้:

รหัสสถานะ HTTP
400 ร้องขอไม่ถูกต้อง

เงื่อนไขข้อผิดพลาดข้อใดข้อหนึ่งต่อไปนี้:

  • ไม่สามารถที่จะแยก PUT หรือ POST ข้อมูล
  • ที่ขาดหายไป PUT หรือ POST ข้อมูล
  • ความพยายามร้องขอไปยัง PUT หรือ POST ข้อมูลที่มีขนาดใหญ่เกินไป
  • การเรียก REST API มีชื่อย่อยที่ไม่ถูกต้องเป็นส่วนหนึ่งของเส้นทาง
  • เส้นทางการเรียก REST API ยาวเกินไป
  • คำขอมีค่าเซิร์ฟเวอร์ที่ไม่รู้จัก
  • ดัชนีสำหรับการค้นหาที่ไม่ได้กำหนดไว้ในของคุณ Firebase เรียลไทม์กฎฐานข้อมูล
  • คำขอไม่สนับสนุนพารามิเตอร์การค้นหาตัวใดตัวหนึ่งที่ระบุ
  • พารามิเตอร์คำขอผสมแบบสอบถามกับตื้น GET คำขอ
401 ไม่ได้รับอนุญาต

เงื่อนไขข้อผิดพลาดข้อใดข้อหนึ่งต่อไปนี้:

  • โทเค็นการตรวจสอบสิทธิ์หมดอายุแล้ว
  • โทเค็นการตรวจสอบสิทธิ์ที่ใช้ในคำขอไม่ถูกต้อง
  • การตรวจสอบสิทธิ์ด้วย access_token ล้มเหลว
  • การร้องขอของคุณละเมิด Firebase เรียลไทม์กฎฐานข้อมูล
404 ไม่พบ ไม่พบฐานข้อมูล Firebase ที่ระบุ
ข้อผิดพลาด 500 เซิร์ฟเวอร์ภายใน เซิร์ฟเวอร์ส่งคืนข้อผิดพลาด ดูข้อความแสดงข้อผิดพลาดสำหรับรายละเอียดเพิ่มเติม
503 บริการไม่พร้อมใช้งาน ฐานข้อมูลเรียลไทม์ของ Firebase ที่ระบุไม่พร้อมใช้งานชั่วคราว ซึ่งหมายความว่าไม่ได้พยายามส่งคำขอ

การรักษาความปลอดภัยข้อมูล

Firebase มีภาษาความปลอดภัยที่ช่วยให้เรากำหนดได้ว่าผู้ใช้รายใดมีสิทธิ์อ่านและเขียนข้อมูลในโหนดต่างๆ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับมันใน เรียลไทม์กฎฐานข้อมูล

ตอนนี้เราได้ครอบคลุมการบันทึกข้อมูลแล้ว เราสามารถเรียนรู้วิธีดึงข้อมูลของเราจากฐานข้อมูล Firebase ผ่าน REST API ได้ในส่วนถัดไป