การอ่านข้อมูลด้วย 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 Primitive (สตริง ตัวเลข หรือบูลีน) ระบบจะแสดงผลค่าของข้อมูลนั้น หากข้อมูลสแนปชอตที่ตำแหน่งเป็นออบเจ็กต์ 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'
การค้นหาจะกรองได้ครั้งละ 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
เราใช้ฐานข้อมูลข้อเท็จจริงเกี่ยวกับไดโนเสาร์และ 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 ด้านของการค้นหา
ตัวอย่างต่อไปนี้จะค้นหาไดโนเสาร์ทั้งหมดที่มีชื่อขึ้นต้นด้วยตัวอักษร "b"
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 / 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 ระบบจะส่งเหตุการณ์นี้หาก 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