การอ่านข้อมูลด้วย GET
เราอ่านข้อมูลจากฐานข้อมูล Firebase ได้โดยส่งคําขอ GET
ไปยัง URL ปลายทาง มาต่อจากตัวอย่างบล็อกจากส่วนก่อนหน้าและอ่านข้อมูลบล็อกโพสต์ทั้งหมดกัน
curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=pretty'
คำขอที่สำเร็จจะแสดงด้วยรหัสสถานะ HTTP 200 OK
และการตอบกลับจะมีข้อมูลที่เราจะดึงข้อมูล
การเพิ่มพารามิเตอร์ URI
REST API ยอมรับพารามิเตอร์การค้นหาหลายรายการเมื่ออ่านข้อมูลจากฐานข้อมูล Firebase พารามิเตอร์ที่ใช้กันมากที่สุดมีดังนี้ ดูรายการทั้งหมดได้ในเอกสารอ้างอิง REST API
การตรวจสอบสิทธิ์
พารามิเตอร์คำขอ auth
อนุญาตให้เข้าถึงข้อมูลที่ Firebase Realtime Database Security Rules ปกป้องอยู่ และคำขอทุกประเภทรองรับพารามิเตอร์นี้ โดยอาร์กิวเมนต์อาจเป็นความลับของแอป Firebase หรือโทเค็นการตรวจสอบสิทธิ์ ตามที่อธิบายไว้ในผู้ใช้ในโปรเจ็กต์ Firebase ในตัวอย่างต่อไปนี้ เราจะส่งคําขอ GET
ที่มีพารามิเตอร์ auth
โดยที่ CREDENTIAL
คือความลับของแอป Firebase หรือโทเค็นการตรวจสอบสิทธิ์
curl 'https://docs-examples.firebaseio.com/auth-example.json?auth=CREDENTIAL'
พิมพ์
การระบุ print=pretty
จะแสดงผลข้อมูลในรูปแบบที่มนุษย์อ่านได้
curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=pretty'
การระบุ print=silent
จะแสดงผลเป็น 204 No Content
เมื่อดำเนินการสำเร็จ
curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=silent'
Callback
หากต้องการเรียกใช้ REST จากเว็บเบราว์เซอร์ในโดเมนต่างๆ คุณสามารถใช้ JSONP เพื่อรวมการตอบกลับไว้ในฟังก์ชันการเรียกกลับ JavaScript เพิ่ม callback=
เพื่อให้ REST API ตัดข้อมูลที่ได้รับไว้ในฟังก์ชันการเรียกกลับที่คุณระบุ เช่น
<script> function gotData(data) { console.log(data); } </script> <script src="https://docs-examples.firebaseio.com/fireblog/posts.json?callback=gotData">
น้ำตื้น
ฟีเจอร์นี้เป็นฟีเจอร์ขั้นสูงที่ออกแบบมาเพื่อช่วยให้คุณทำงานกับชุดข้อมูลขนาดใหญ่ได้โดยไม่ต้องดาวน์โหลดทุกอย่าง หากต้องการใช้ ให้เพิ่ม shallow=true
เป็นพารามิเตอร์ ซึ่งจะจํากัดระดับความลึกของข้อมูลที่แสดง หากข้อมูลในตำแหน่งนั้นเป็น JSON พื้นฐาน (สตริง ตัวเลข หรือบูลีน) ระบบจะแสดงผลค่าของข้อมูลนั้น หากสแนปชอตข้อมูลในตำแหน่งนั้นเป็นออบเจ็กต์ JSON ระบบจะตัดค่าของแต่ละคีย์ให้เหลือเพียง true เช่น ใช้ข้อมูลด้านล่าง
{ "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!"
ลองใช้กับคำขอ curl
นี้
curl 'https://docs-examples.firebaseio.com/rest/retrieving-data.json?shallow=true&print=pretty'
หมดเวลา
ใช้เพื่อจำกัดระยะเวลาในการอ่านฝั่งเซิร์ฟเวอร์ หากคำขออ่านไม่เสร็จภายในเวลาที่กำหนด ระบบจะสิ้นสุดการดำเนินการด้วยข้อผิดพลาด HTTP 400 ซึ่งจะเป็นประโยชน์อย่างยิ่งเมื่อคุณคาดว่าจะมีการโอนข้อมูลเพียงเล็กน้อยและไม่ต้องการรอนานเกินไปเพื่อดึงข้อมูลซับต้นไม้ขนาดใหญ่ เวลาที่ใช้ในการอ่านจริงอาจแตกต่างกันไปตามขนาดข้อมูลและการแคช
ระบุ timeouts
โดยใช้รูปแบบต่อไปนี้ 3ms
,
3s
หรือ 3min
พร้อมตัวเลขและหน่วย หากไม่ได้ระบุ ระบบจะใช้ timeout
สูงสุดเป็น 15min
หาก timeout
ไม่ใช่ค่าบวกหรือเกินค่าสูงสุด ระบบจะปฏิเสธคําขอพร้อมข้อผิดพลาด HTTP 400
ในตัวอย่างต่อไปนี้ คำขอ GET
มี timeout
ความยาว 10 วินาที
curl 'https://docs-examples.firebaseio.com/rest/retrieving-data.json?timeout=10s'
การกรองข้อมูล
เราสามารถสร้างข้อความค้นหาเพื่อกรองข้อมูลตามปัจจัยต่างๆ ได้ ในการเริ่มต้น ให้ระบุวิธีที่คุณต้องการให้กรองข้อมูลโดยใช้พารามิเตอร์ orderBy
จากนั้นรวม orderBy
เข้ากับพารามิเตอร์อื่นๆ อีก 5 รายการ ได้แก่
limitToFirst
, limitToLast
, startAt
, endAt
และ equalTo
เนื่องจากพวกเราทุกคนที่ Firebase คิดว่าไดโนเสาร์เจ๋งมาก เราจะใช้ตัวอย่างข้อมูลฐานข้อมูลเกี่ยวกับข้อเท็จจริงของไดโนเสาร์เพื่อสาธิตวิธีกรองข้อมูล
{ "lambeosaurus": { "height": 2.1, "length": 12.5, "weight": 5000 }, "stegosaurus": { "height": 4, "length": 9, "weight": 2500 } }
เรากรองข้อมูลได้ 3 วิธี ได้แก่ ตามคีย์ย่อย ตามคีย์ หรือตามค่า การค้นหาจะขึ้นต้นด้วยพารามิเตอร์อย่างใดอย่างหนึ่งต่อไปนี้ จากนั้นต้องรวมเข้ากับพารามิเตอร์ต่อไปนี้อย่างน้อย 1 รายการ startAt
, endAt
, limitToFirst
, limitToLast
หรือ equalTo
การกรองตามคีย์ย่อยที่ระบุ
เรากรองโหนดตามคีย์ย่อยทั่วไปได้โดยส่งคีย์นั้นไปยังพารามิเตอร์ orderBy
ตัวอย่างเช่น หากต้องการดึงข้อมูลไดโนเสาร์ทั้งหมดที่มีความสูงมากกว่า 3 เราจะทำดังนี้
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'
โหนดที่ไม่มีคีย์ย่อยที่เรากรองอยู่จะจัดเรียงด้วยค่า null
ดูรายละเอียดเกี่ยวกับวิธีจัดเรียงข้อมูลได้ที่วิธีจัดเรียงข้อมูล
นอกจากนี้ Firebase ยังรองรับการค้นหาที่จัดเรียงตามรายการย่อยที่ฝังลึกแทนที่จะจัดเรียงเฉพาะรายการย่อยที่อยู่ 1 ระดับด้านล่าง ซึ่งจะมีประโยชน์หากคุณมีข้อมูลที่ฝังอยู่ลึกๆ เช่นนี้
{ "lambeosaurus": { "dimensions": { "height" : 2.1, "length" : 12.5, "weight": 5000 } }, "stegosaurus": { "dimensions": { "height" : 4, "length" : 9, "weight" : 2500 } } }
หากต้องการค้นหาความสูงในตอนนี้ เราจะใช้เส้นทางแบบเต็มไปยังออบเจ็กต์แทนคีย์เดียว ดังนี้
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="dimensions/height"&startAt=3&print=pretty'
การค้นหาจะกรองตามคีย์ได้ทีละรายการเท่านั้น การใช้พารามิเตอร์ orderBy
หลายครั้งในคําขอเดียวกันจะทำให้เกิดข้อผิดพลาด
การกรองตามคีย์
นอกจากนี้ เรายังกรองโหนดตามคีย์ได้โดยใช้พารามิเตอร์ orderBy="$key"
ตัวอย่างต่อไปนี้จะดึงข้อมูลไดโนเสาร์ทั้งหมดที่มีชื่อขึ้นต้นด้วยตัวอักษร a
ถึง m
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&startAt="a"&endAt="m"&print=pretty'
การกรองตามค่า
เรากรองโหนดตามค่าของคีย์ย่อยได้โดยใช้พารามิเตอร์ orderBy="$value"
สมมติว่าไดโนเสาร์กำลังมีการแข่งขันกีฬาไดโนเสาร์ และเรากำลังติดตามคะแนนของไดโนเสาร์ในรูปแบบต่อไปนี้
{ "scores": { "bruhathkayosaurus": 55, "lambeosaurus": 21, "linhenykus": 80, "pterodactyl": 93, "stegosaurus": 5, "triceratops": 22 } }
หากต้องการดึงข้อมูลไดโนเสาร์ทั้งหมดที่มีคะแนนสูงกว่า 50 เราอาจส่งคำขอต่อไปนี้
curl 'https://dinosaur-facts.firebaseio.com/scores.json?orderBy="$value"&startAt=50&print=pretty'
ดูวิธีจัดเรียงข้อมูลเพื่อดูคำอธิบายเกี่ยวกับวิธีจัดเรียงค่า null
, บูลีน, สตริง และออบเจ็กต์เมื่อใช้ orderBy="$value"
การกรองที่ซับซ้อน
เรารวมพารามิเตอร์หลายรายการเข้าด้วยกันเพื่อสร้างการค้นหาที่ซับซ้อนมากขึ้นได้
จำกัดการค้นหา
พารามิเตอร์ limitToFirst
และ limitToLast
ใช้เพื่อกำหนดจำนวนรายการย่อยสูงสุดที่จะรับข้อมูล หากตั้งค่าขีดจำกัดไว้ที่ 100 เราจะรับเฉพาะรายการที่ตรงกันไม่เกิน 100 รายการ หากมีข้อความน้อยกว่า 100 รายการที่จัดเก็บไว้ในฐานข้อมูล เราจะได้รับทุกรายการ อย่างไรก็ตาม หากมีข้อความมากกว่า 100 รายการ เราจะได้รับข้อมูลของข้อความเพียง 100 รายการเท่านั้น ข้อความเหล่านี้จะเป็นข้อความที่สั่งซื้อ 100 รายการแรกหากเราใช้ limitToFirst
หรือข้อความที่สั่งซื้อ 100 รายการล่าสุดหากเราใช้ limitToLast
เมื่อใช้ฐานข้อมูลข้อเท็จจริงเกี่ยวกับไดโนเสาร์และ orderBy
เราพบไดโนเสาร์ที่หนักที่สุด 2 สายพันธุ์ดังนี้
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="weight"&limitToLast=2&print=pretty'
ในทํานองเดียวกัน เราค้นหาไดโนเสาร์ที่สั้นที่สุด 2 ตัวได้โดยใช้ limitToFirst
ดังนี้
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&limitToFirst=2&print=pretty'
นอกจากนี้ เรายังทำการค้นหาแบบจำกัดด้วย orderBy="$value"
ได้ด้วย หากต้องการสร้างตารางอันดับที่มีคู่แข่งกีฬาไดโนเสาร์ที่มีคะแนนสูงสุด 3 อันดับแรก เราอาจทำดังนี้
curl 'https://dinosaur-facts.firebaseio.com/scores.json?orderBy="$value"&limitToLast=3&print=pretty'
การค้นหาช่วง
การใช้ startAt
, endAt
และ equalTo
ช่วยให้เราเลือกจุดเริ่มต้นและจุดสิ้นสุดแบบกำหนดเองสำหรับข้อความค้นหาได้ เช่น หากต้องการค้นหาไดโนเสาร์ทั้งหมดที่มีความสูงอย่างน้อย 3 เมตร ให้รวม orderBy
และ startAt
เข้าด้วยกัน
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'
เราสามารถใช้ endAt
เพื่อค้นหาไดโนเสาร์ทั้งหมดที่มีชื่อมาก่อน Pterodactyl ตามลําดับตัวอักษร ดังนี้
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&endAt="pterodactyl"&print=pretty'
เราสามารถใช้ startAt
และ endAt
ร่วมกันเพื่อจำกัดการค้นหาทั้ง 2 ด้าน
ตัวอย่างต่อไปนี้จะค้นหาไดโนเสาร์ทั้งหมดที่มีชื่อขึ้นต้นด้วยตัวอักษร "ข"
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&startAt="b"&endAt="b\uf8ff"&print=pretty'
การค้นหาช่วงยังมีประโยชน์เมื่อคุณต้องการแบ่งหน้าข้อมูลด้วย
กำลังประกอบรูปภาพเข้าด้วยกัน
เราสามารถใช้เทคนิคเหล่านี้ร่วมกันเพื่อสร้างการค้นหาที่ซับซ้อนได้ ตัวอย่างเช่น คุณอาจต้องการค้นหาชื่อไดโนเสาร์ทั้งหมดที่เตี้ยกว่าหรือสูงเท่ากับสเตโกซอรัส ซึ่งเป็นไดโนเสาร์ตัวโปรดของเรา
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"
การจัดเรียงข้อมูล
ส่วนนี้จะอธิบายวิธีจัดเรียงข้อมูลเมื่อใช้พารามิเตอร์การกรองทั้ง 3 รายการ
orderBy
เมื่อใช้ orderBy
กับชื่อคีย์ย่อย ระบบจะจัดเรียงข้อมูลที่มีคีย์ย่อยที่ระบุดังนี้
-
รายการย่อยที่มีค่า
null
สำหรับคีย์ย่อยที่ระบุจะแสดงก่อน -
รายการย่อยที่มีค่าเป็น
false
สำหรับคีย์ย่อยที่ระบุจะแสดงต่อจากนี้ หากรายการย่อยหลายรายการมีค่าเป็นfalse
ระบบจะจัดเรียงตามลําดับตัวอักษรตามคีย์ -
รายการย่อยที่มีค่าเป็น
true
สำหรับคีย์ย่อยที่ระบุจะแสดงต่อจากนี้ หากรายการย่อยหลายรายการมีค่าเป็นtrue
ระบบจะจัดเรียงตามลําดับตัวอักษรตามคีย์ - รายการย่อยที่มีค่าตัวเลขจะแสดงต่อจากนี้โดยจัดเรียงจากน้อยไปมาก หากโหนดย่อยหลายโหนดมีค่าตัวเลขเหมือนกันสําหรับโหนดย่อยที่ระบุ ระบบจะจัดเรียงตามคีย์
- สตริงจะอยู่หลังตัวเลขและจัดเรียงตามลําดับตัวอักษรจากน้อยไปมาก หากโหนดย่อยหลายรายการมีค่าเดียวกันสำหรับโหนดย่อยที่ระบุ ระบบจะจัดเรียงโหนดย่อยตามลําดับตัวอักษรตามคีย์
- ออบเจ็กต์จะอยู่ท้ายสุดและจัดเรียงตามลําดับตัวอักษรตามคีย์จากน้อยไปมาก
orderBy="$key"
เมื่อใช้พารามิเตอร์ orderBy="$key"
เพื่อจัดเรียงข้อมูล ระบบจะแสดงผลข้อมูลตามลําดับจากน้อยไปมากตามคีย์ ดังนี้ โปรดทราบว่าคีย์ต้องเป็นสตริงเท่านั้น
- รายการย่อยที่มีคีย์ที่แยกวิเคราะห์เป็นจำนวนเต็ม 32 บิตจะแสดงก่อน โดยจัดเรียงตามลําดับจากน้อยไปมาก
- รายการย่อยที่มีค่าสตริงเป็นคีย์จะตามมา โดยจัดเรียงตามลําดับตัวอักษรจากน้อยไปมาก
orderBy="$value"
เมื่อใช้พารามิเตอร์ orderBy="$value"
เพื่อจัดเรียงข้อมูล ระบบจะจัดเรียงรายการย่อยตามค่า เกณฑ์การจัดเรียงจะเหมือนกับข้อมูลที่จัดเรียงตามคีย์ย่อย ยกเว้นจะใช้ค่าของโหนดแทนค่าของคีย์ย่อยที่ระบุ
orderBy="$priority"
เมื่อใช้พารามิเตอร์ orderBy="$priority"
เพื่อจัดเรียงข้อมูล ลําดับของรายการย่อยจะพิจารณาจากลําดับความสําคัญและคีย์ ดังนี้ โปรดทราบว่าค่าลําดับความสําคัญต้องเป็นตัวเลขหรือสตริงเท่านั้น
- เด็กที่ไม่มีลําดับความสําคัญ (ค่าเริ่มต้น) จะมาก่อน
- เด็กที่มีตัวเลขเป็นลําดับความสําคัญจะแสดงต่อจากนั้น โดยจัดเรียงตามลําดับความสําคัญจากน้อยไปมาก
- รายการย่อยที่มีสตริงเป็นลําดับความสําคัญจะแสดงเป็นลําดับสุดท้าย โดยระบบจะจัดเรียงตามลําดับตัวอักษรตามลําดับความสําคัญ
- เมื่อรายการย่อย 2 รายการมีลําดับความสําคัญเดียวกัน (รวมถึงไม่มีลําดับความสําคัญ) ระบบจะจัดเรียงตามคีย์ คีย์ตัวเลขจะมาก่อน (จัดเรียงตามตัวเลข) ตามด้วยคีย์ที่เหลือ (จัดเรียงตามลําดับตัวอักษร)
ดูข้อมูลเพิ่มเติมเกี่ยวกับลําดับความสําคัญได้ที่การอ้างอิง API
สตรีมมิงจาก REST API
ปลายทาง REST ของ Firebase รองรับโปรโตคอล EventSource / เหตุการณ์ที่ส่งจากเซิร์ฟเวอร์ ซึ่งทำให้สตรีมการเปลี่ยนแปลงไปยังตำแหน่งเดียวในฐานข้อมูล Firebase ได้ง่าย
ในการเริ่มต้นสตรีม เราจะต้องดำเนินการต่อไปนี้
-
ตั้งค่าส่วนหัว Accept ของลูกค้าเป็น
text/event-stream
- ปฏิบัติตามการเปลี่ยนเส้นทาง HTTP โดยเฉพาะรหัสสถานะ HTTP 307
-
ใส่พารามิเตอร์การค้นหา
auth
หากตำแหน่งฐานข้อมูล Firebase กำหนดให้ต้องมีสิทธิ์อ่าน
ในทางกลับกัน เซิร์ฟเวอร์จะส่งเหตุการณ์ที่มีชื่อเมื่อสถานะของข้อมูลที่ URL ที่ขอมีการเปลี่ยนแปลง โครงสร้างของข้อความเหล่านี้เป็นไปตามโปรโตคอล EventSource
event: event name data: JSON encoded data payload
เซิร์ฟเวอร์อาจส่งเหตุการณ์ต่อไปนี้
ใส่ | ข้อมูลที่เข้ารหัส JSON จะเป็นออบเจ็กต์ที่มีคีย์ 2 คีย์ ได้แก่ path และ data Path จะชี้ไปยังตำแหน่งที่สัมพันธ์กับ URL คำขอ ไคลเอ็นต์ควรแทนที่ข้อมูลทั้งหมดในตำแหน่งนั้นในแคชด้วยข้อมูลที่ระบุไว้ในข้อความ |
แพตช์ | ข้อมูลที่เข้ารหัส JSON จะเป็นออบเจ็กต์ที่มีคีย์ 2 คีย์ ได้แก่ path และ data Path จะชี้ไปยังตำแหน่งที่สัมพันธ์กับ URL คำขอ สำหรับคีย์แต่ละรายการในข้อมูลนั้น ลูกค้าควรแทนที่คีย์ที่เกี่ยวข้องในแคชด้วยข้อมูลสำหรับคีย์นั้นในข้อความ |
Keep-alive | ข้อมูลของเหตุการณ์นี้เป็นค่า Null โดยคุณไม่ต้องดำเนินการใดๆ |
ยกเลิก | ข้อมูลของเหตุการณ์นี้มีค่าเป็น Null ระบบจะส่งเหตุการณ์นี้หาก Firebase Realtime Database Security Rules ทําให้ระบบไม่อนุญาตให้อ่านที่ตําแหน่งที่จําเป็นอีกต่อไป |
auth_revoked | ข้อมูลของเหตุการณ์นี้คือสตริงที่ระบุว่าข้อมูลเข้าสู่ระบบหมดอายุแล้ว ระบบจะส่งเหตุการณ์นี้เมื่อพารามิเตอร์การตรวจสอบสิทธิ์ที่ระบุไม่ถูกต้องอีกต่อไป |
ด้านล่างนี้คือตัวอย่างชุดเหตุการณ์ที่เซิร์ฟเวอร์อาจส่ง
// 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}}
หากใช้ Go ให้ดู Firego ซึ่งเป็น Wrapper ของบุคคลที่สามสำหรับ Firebase REST และ Streaming API