การอ่านข้อมูลด้วย 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=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 คีย์ ได้แก่ เส้นทางและข้อมูล เส้นทางจะชี้ไปยังตำแหน่งซึ่งสัมพันธ์กับ URL คำขอ ไคลเอ็นต์ควรแทนที่คีย์ที่ตรงกันในแคชด้วยข้อมูลของคีย์นั้นในข้อความ |
Keep-alive | ข้อมูลของเหตุการณ์นี้มีค่าเป็น Null คุณจึงไม่ต้องดําเนินการใดๆ |
ยกเลิก | ข้อมูลของเหตุการณ์นี้เป็นค่า Null ระบบจะส่งเหตุการณ์นี้หาก Firebase Realtime Database Security Rules ทําให้ระบบไม่อนุญาตให้อ่านที่ตําแหน่งที่จําเป็นอีกต่อไป |
การตรวจสอบสิทธิ์_ถูกยกเลิก | ข้อมูลสำหรับเหตุการณ์นี้เป็นสตริงที่ระบุว่าข้อมูลเข้าสู่ระบบหมดอายุแล้ว ระบบจะส่งเหตุการณ์นี้เมื่อพารามิเตอร์การตรวจสอบสิทธิ์ที่ระบุไม่ถูกต้องอีกต่อไป |
ด้านล่างนี้คือตัวอย่างชุดเหตุการณ์ที่เซิร์ฟเวอร์อาจส่ง
// 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