การอ่านข้อมูลด้วย 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 เพื่อรวมการตอบกลับไว้ในฟังก์ชัน Callback ของ JavaScript
เพิ่ม callback= เพื่อให้ REST API รวมข้อมูลที่แสดงไว้ใน
ฟังก์ชัน Callback ที่คุณระบุ เช่น
<script>
function gotData(data) {
console.log(data);
}
</script>
<script src="https://docs-examples.firebaseio.com/fireblog/posts.json?callback=gotData">shallow
ฟีเจอร์นี้เป็นฟีเจอร์ขั้นสูงที่ออกแบบมาเพื่อช่วยให้คุณทำงานกับชุดข้อมูลขนาดใหญ่ได้โดยไม่ต้อง
ดาวน์โหลดทุกอย่าง หากต้องการใช้ฟีเจอร์นี้ ให้เพิ่ม 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 ยังรองรับการค้นหาที่จัดเรียงตามคีย์ย่อยที่ซ้อนกันหลายระดับ ไม่ใช่เฉพาะคีย์ย่อยที่อยู่ระดับล่างลงมาเท่านั้น ซึ่งจะเป็นประโยชน์หากคุณมีข้อมูลที่ซ้อนกันหลายระดับ เช่น
{
"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'
การค้นหาจะกรองได้ครั้งละ 1 คีย์เท่านั้น การใช้พารามิเตอร์ 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
เราสามารถค้นหาไดโนเสาร์ 2 ตัวที่มีน้ำหนักมากที่สุดได้โดยใช้ฐานข้อมูลข้อเท็จจริงเกี่ยวกับไดโนเสาร์และ orderBy
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 ด้านของการค้นหาได้
ตัวอย่างต่อไปนี้จะค้นหาไดโนเสาร์ทั้งหมดที่มีชื่อขึ้นต้นด้วยตัวอักษร "b"
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&startAt="b"&endAt="b\uf8ff"&print=pretty'
การค้นหาแบบช่วงยังมีประโยชน์เมื่อคุณต้องการแบ่งหน้าข้อมูล
สรุปข้อมูลทั้งหมด
เราสามารถรวมเทคนิคทั้งหมดนี้เพื่อสร้างการค้นหาที่ซับซ้อนได้ เช่น คุณอาจต้องการค้นหาชื่อไดโนเสาร์ทั้งหมดที่มีความสูงน้อยกว่าหรือเท่ากับไดโนเสาร์พันธุ์โปรดของเราอย่าง Stegosaurus
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 / Server-Sent Events ซึ่งช่วยให้สตรีมการเปลี่ยนแปลงไปยังตำแหน่งเดียวใน ฐานข้อมูล Firebase ได้อย่างง่ายดาย
หากต้องการเริ่มต้นใช้งานการสตรีม คุณจะต้องทำดังนี้
-
ตั้งค่าส่วนหัว Accept ของไคลเอ็นต์เป็น
text/event-stream - ปฏิบัติตามการเปลี่ยนเส้นทาง HTTP โดยเฉพาะรหัสสถานะ HTTP 307
-
ใส่พารามิเตอร์การค้นหา
authหากตำแหน่งฐานข้อมูล Firebase ต้องได้รับ สิทธิ์ในการอ่าน
เมื่อสถานะของข้อมูลใน URL ที่ขอเปลี่ยนแปลง เซิร์ฟเวอร์จะส่งเหตุการณ์ที่มีชื่อกลับมา โครงสร้างของข้อความเหล่านี้เป็นไปตามโปรโตคอล EventSource ดังนี้
event: event name data: JSON encoded data payload
เซิร์ฟเวอร์อาจส่งเหตุการณ์ต่อไปนี้
| ใส่ | ข้อมูลที่เข้ารหัส JSON จะเป็นออบเจ็กต์ที่มีคีย์ 2 รายการ ได้แก่ เส้นทางและข้อมูล เส้นทางจะชี้ไปยังตำแหน่งที่สัมพันธ์กับ URL คำขอ ไคลเอ็นต์ควรแทนที่ข้อมูลทั้งหมดในตำแหน่งนั้นในแคชด้วยข้อมูลที่ระบุไว้ในข้อความ |
| แพตช์ | ข้อมูลที่เข้ารหัส JSON จะเป็นออบเจ็กต์ที่มีคีย์ 2 รายการ ได้แก่ เส้นทางและข้อมูล เส้นทางจะชี้ไปยังตำแหน่งที่สัมพันธ์กับ URL คำขอ สำหรับคีย์แต่ละรายการในข้อมูล ไคลเอ็นต์ควรแทนที่คีย์ที่เกี่ยวข้องในแคชด้วยข้อมูลสำหรับคีย์นั้นในข้อความ |
| Keep-alive | ข้อมูลสำหรับเหตุการณ์นี้เป็นค่า Null คุณจึงไม่จำเป็นต้องดำเนินการใดๆ |
| ยกเลิก | ข้อมูลสำหรับเหตุการณ์นี้เป็นค่า Null ระบบจะส่งเหตุการณ์นี้หากFirebase Realtime Database Security Rulesทำให้ไม่ได้รับอนุญาตให้อ่านข้อมูลในตำแหน่งที่ขออีกต่อไป |
| auth_revoked | ข้อมูลสำหรับเหตุการณ์นี้เป็นสตริงที่ระบุว่าข้อมูลเข้าสู่ระบบหมดอายุแล้ว ระบบจะส่งเหตุการณ์นี้เมื่อพารามิเตอร์ auth ที่ระบุไม่ถูกต้องอีกต่อไป |
ด้านล่างนี้คือตัวอย่างชุดเหตุการณ์ที่เซิร์ฟเวอร์อาจส่ง
// 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