การอ่านข้อมูลด้วย 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 และได้รับการสนับสนุนจากคำขอทุกประเภท อาร์กิวเมนต์อาจเป็นข้อมูลลับของแอป Firebase หรือโทเค็นการตรวจสอบสิทธิ์ ตามที่อธิบายไว้ใน Users in Firebase Projects ในตัวอย่างต่อไปนี้ เราส่งคำขอ 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'
โทรกลับ
หากต้องการโทร REST จากเว็บเบราว์เซอร์ข้ามโดเมน คุณสามารถใช้ JSONP เพื่อล้อมการตอบกลับในฟังก์ชันเรียกกลับ 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 ค่าของแต่ละคีย์จะถูกตัดทอนให้เป็น จริง ตัวอย่างเช่น การใช้ข้อมูลด้านล่าง:
{ "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
เข้ากับพารามิเตอร์ใดๆ จากห้าพารามิเตอร์อื่นๆ ได้แก่ limitToFirst
, limitToLast
, startAt
, endAt
และ equalTo
เนื่องจากพวกเราทุกคนที่ Firebase คิดว่าไดโนเสาร์ค่อนข้างเจ๋ง เราจะใช้ตัวอย่างจากฐานข้อมูลตัวอย่างข้อเท็จจริงเกี่ยวกับไดโนเสาร์เพื่อสาธิตวิธีที่คุณสามารถกรองข้อมูล:
{ "lambeosaurus": { "height": 2.1, "length": 12.5, "weight": 5000 }, "stegosaurus": { "height": 4, "length": 9, "weight": 2500 } }
เราสามารถกรองข้อมูลด้วยวิธีใดวิธีหนึ่งจากสามวิธี: ตาม คีย์ลูก ตาม คีย์ หรือตาม ค่า แบบสอบถามเริ่มต้นด้วยพารามิเตอร์ตัวใดตัวหนึ่งเหล่านี้ จากนั้นจะต้องรวมกับพารามิเตอร์ต่อไปนี้ตั้งแต่หนึ่งตัวขึ้นไป: 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'
แบบสอบถามสามารถกรองได้ครั้งละหนึ่งคีย์เท่านั้น การใช้พารามิเตอร์ 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
เราสามารถค้นหาไดโนเสาร์ที่หนักที่สุดสองตัวได้:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="weight"&limitToLast=2&print=pretty'
ในทำนองเดียวกัน เราสามารถค้นหาไดโนเสาร์ที่สั้นที่สุดสองตัวได้โดยใช้ limitToFirst
:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&limitToFirst=2&print=pretty'
นอกจากนี้เรายังสามารถดำเนินการค้นหาแบบจำกัดด้วย orderBy="$value"
หากเราต้องการสร้างกระดานผู้นำที่มีผู้แข่งขันกีฬาไดโนที่มีคะแนนสูงสุดสามอันดับแรก เราสามารถดำเนินการดังต่อไปนี้:
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
เพื่อจำกัดการสืบค้นทั้งสองด้าน ตัวอย่างต่อไปนี้ค้นหาไดโนเสาร์ทุกตัวที่ชื่อขึ้นต้นด้วยตัวอักษร "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"
วิธีเรียงลำดับข้อมูล
ส่วนนี้จะอธิบายวิธีการเรียงลำดับข้อมูลของคุณเมื่อใช้พารามิเตอร์การกรองทั้งสามตัว
สั่งโดย
เมื่อใช้ orderBy
กับชื่อของคีย์ลูก ข้อมูลที่มีคีย์ลูกที่ระบุจะถูกเรียงลำดับดังนี้:
- รายการย่อยที่มีค่า
null
สำหรับคีย์ลูกที่ระบุจะต้องมาก่อน - รายการย่อยที่มีค่า
false
สำหรับคีย์ลูกที่ระบุจะอยู่ลำดับถัดไป หากลูกหลายคนมีค่าเป็นfalse
พวกเขาจะถูกจัดเรียงตาม พจนานุกรม ตามคีย์ - รายการย่อยที่มีค่า
true
สำหรับรหัสลูกที่ระบุจะอยู่ลำดับถัดไป หากรายการย่อยหลายรายการมีค่าเป็นtrue
รายการเหล่านั้นจะถูกจัดเรียงตามพจนานุกรมตามคีย์ - ลูกที่มีค่าตัวเลขจะมาถัดไป เรียงลำดับจากน้อยไปหามาก ถ้าลูกหลายคนมีค่าตัวเลขเหมือนกันสำหรับโหนดลูกที่ระบุ พวกเขาจะถูกจัดเรียงตามคีย์
- สตริงจะอยู่หลังตัวเลข และจัดเรียงตามพจนานุกรมจากน้อยไปหามาก หากลูกหลายคนมีค่าเดียวกันสำหรับโหนดลูกที่ระบุ พวกเขาจะถูกเรียงลำดับตามพจนานุกรมตามคีย์
- วัตถุจะอยู่ลำดับสุดท้าย และจัดเรียงพจนานุกรมตามคีย์ตามลำดับจากน้อยไปหามาก
สั่งซื้อโดย = "$ คีย์"
เมื่อใช้พารามิเตอร์ orderBy="$key"
เพื่อจัดเรียงข้อมูลของคุณ ข้อมูลจะถูกส่งกลับโดยเรียงจากน้อยไปหามากตามคีย์ดังนี้ โปรดทราบว่าคีย์ต้องเป็นสตริงเท่านั้น
- รายการย่อยที่มีคีย์ที่สามารถแยกวิเคราะห์เป็นจำนวนเต็ม 32 บิตมาก่อน โดยเรียงลำดับจากน้อยไปหามาก
- รายการย่อยที่มีค่าสตริงเป็นคีย์จะอยู่ลำดับถัดไป โดยเรียงลำดับตามพจนานุกรมจากน้อยไปหามาก
orderBy="$value"
เมื่อใช้พารามิเตอร์ orderBy="$value"
เพื่อจัดเรียงข้อมูล ลูกๆ จะถูกเรียงลำดับตามค่าของพวกเขา เกณฑ์การเรียงลำดับจะเหมือนกับข้อมูลที่เรียงลำดับโดยคีย์ลูก ยกเว้นว่าจะใช้ค่าของโหนดแทนค่าของคีย์ลูกที่ระบุ
สั่งซื้อโดย = "$ ลำดับความสำคัญ"
เมื่อใช้พารามิเตอร์ orderBy="$priority"
เพื่อจัดเรียงข้อมูลของคุณ การเรียงลำดับของรายการย่อยจะถูกกำหนดตามลำดับความสำคัญและคีย์ดังต่อไปนี้ โปรดทราบว่าค่าลำดับความสำคัญต้องเป็นตัวเลขหรือสตริงเท่านั้น
- เด็กที่ไม่มีลำดับความสำคัญ (ค่าเริ่มต้น) มาก่อน
- เด็กที่มีตัวเลขเป็นลำดับความสำคัญจะมาเป็นอันดับถัดไป โดยจะเรียงลำดับตามลำดับความสำคัญจากน้อยไปหามาก
- เด็กที่มีเชือกเป็นสิ่งสำคัญที่สุด พวกเขาจะเรียงลำดับตามพจนานุกรมตามลำดับความสำคัญ
- เมื่อใดก็ตามที่ลูกสองคนมีลำดับความสำคัญเท่ากัน (รวมถึงไม่มีลำดับความสำคัญ) พวกเขาจะถูกจัดเรียงตามคีย์ ปุ่มตัวเลขมาก่อน (เรียงลำดับตามตัวเลข) ตามด้วยปุ่มที่เหลือ (เรียงลำดับตามพจนานุกรม)
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับลำดับความสำคัญ โปรดดูที่ การอ้างอิง API
การสตรีมจาก REST API
ตำแหน่งข้อมูล Firebase REST รองรับโปรโตคอล 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 จะเป็นออบเจ็กต์ที่มีสองคีย์: เส้นทางและข้อมูล เส้นทางชี้ไปยังตำแหน่งที่เกี่ยวข้องกับ URL คำขอ ไคลเอนต์ควรแทนที่ข้อมูลทั้งหมดในตำแหน่งนั้นในแคชด้วยข้อมูลที่ระบุในข้อความ |
ปะ | ข้อมูลที่เข้ารหัส JSON จะเป็นออบเจ็กต์ที่มีสองคีย์: เส้นทางและข้อมูล เส้นทางชี้ไปยังตำแหน่งที่เกี่ยวข้องกับ URL คำขอ สำหรับแต่ละคีย์ในข้อมูล ไคลเอนต์ควรแทนที่คีย์ที่เกี่ยวข้องในแคชด้วยข้อมูลสำหรับคีย์นั้นในข้อความ |
ให้มีชีวิตอยู่ | ข้อมูลสำหรับเหตุการณ์นี้เป็นโมฆะ ไม่ต้องดำเนินการใดๆ |
ยกเลิก | ข้อมูลสำหรับเหตุการณ์นี้เป็นโมฆะ กิจกรรมนี้จะถูกส่งหากกฎการรักษาความปลอดภัยของฐานข้อมูล Firebase Realtime ทำให้การอ่านในตำแหน่งที่ร้องขอไม่ได้รับอนุญาตอีกต่อไป |
auth_removed | ข้อมูลสำหรับเหตุการณ์นี้เป็นสตริงที่ระบุว่าข้อมูลรับรองหมดอายุแล้ว เหตุการณ์นี้จะถูกส่งเมื่อพารามิเตอร์การรับรองความถูกต้องที่ให้มาใช้ไม่ได้อีกต่อไป |
ด้านล่างนี้เป็นตัวอย่างของชุดเหตุการณ์ที่เซิร์ฟเวอร์อาจส่ง:
// 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