การอ่านข้อมูลด้วย 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 ห่อข้อมูลที่ส่งคืนในฟังก์ชันการโทรกลับที่คุณระบุ ตัวอย่างเช่น:
<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
กับพารามิเตอร์ใดๆ ในห้าพารามิเตอร์อื่นๆ: 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"
เมื่อใช้พารามิเตอร์ orderBy="$key"
เพื่อจัดเรียงข้อมูล ข้อมูลจะถูกส่งคืนตามลำดับคีย์ดังนี้ โปรดทราบว่าคีย์สามารถเป็นสตริงได้เท่านั้น
- เด็กที่มีคีย์ที่สามารถแยกวิเคราะห์เป็นจำนวนเต็ม 32 บิตมาก่อน เรียงลำดับจากน้อยไปหามาก
- เด็กที่มีค่าสตริงเป็นคีย์อยู่ถัดไป จัดเรียงตามพจนานุกรมจากน้อยไปหามาก
orderBy = "ค่า $"
เมื่อใช้พารามิเตอร์ orderBy="$value"
เพื่อจัดเรียงข้อมูล ระบบจะเรียงลำดับรายการย่อยตามค่า เกณฑ์การจัดลำดับจะเหมือนกับข้อมูลที่จัดลำดับโดยคีย์ลูก ยกเว้นว่าค่าของโหนดจะถูกใช้แทนค่าของคีย์ลูกที่ระบุ
orderBy="$priority"
เมื่อใช้พารามิเตอร์ orderBy="$priority"
เพื่อจัดเรียงข้อมูลของคุณ ลำดับของรายการย่อยจะกำหนดตามลำดับความสำคัญและคีย์ดังนี้ โปรดทราบว่าค่าลำดับความสำคัญสามารถเป็นตัวเลขหรือสตริงเท่านั้น
- เด็กที่ไม่มีลำดับความสำคัญ (ค่าเริ่มต้น) จะมาก่อน
- เด็กที่มีหมายเลขเป็นลำดับถัดมา โดยจะจัดเรียงตามตัวเลขตามลำดับความสำคัญ เล็กไปใหญ่
- เด็กที่มีสตริงเป็นลำดับความสำคัญจะอยู่ท้ายสุด จัดเรียงตามพจนานุกรมตามลำดับความสำคัญ
- เมื่อใดก็ตามที่เด็กสองคนมีลำดับความสำคัญเท่ากัน (รวมถึงไม่มีลำดับความสำคัญ) พวกเขาจะถูกจัดเรียงตามคีย์ แป้นตัวเลขมาก่อน (เรียงตามตัวเลข) ตามด้วยแป้นที่เหลือ (เรียงตามพจนานุกรม)
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับลำดับความสำคัญ โปรดดู การอ้างอิง API
สตรีมจาก REST API
ตำแหน่งข้อมูล Firebase REST รองรับโปรโตคอล EventSource / Server-Sent Events ทำให้ง่ายต่อการสตรีมการเปลี่ยนแปลงไปยังตำแหน่งเดียวในฐานข้อมูล Firebase ของเรา
ในการเริ่มต้นสตรีม เราจะต้องทำสิ่งต่อไปนี้:
- ตั้งค่าส่วนหัวยอมรับของลูกค้าเป็น
text/event-stream
- เคารพการเปลี่ยนเส้นทาง HTTP โดยเฉพาะรหัสสถานะ HTTP 307
- รวมพารามิเตอร์การค้นหารับรอง
auth
หากตำแหน่งฐานข้อมูล Firebase ต้องการสิทธิ์ในการอ่าน
ในทางกลับกัน เซิร์ฟเวอร์จะส่งเหตุการณ์ที่มีชื่อเป็นสถานะของข้อมูลที่มีการเปลี่ยนแปลง URL ที่ร้องขอ โครงสร้างของข้อความเหล่านี้สอดคล้องกับโปรโตคอล EventSource:
event: event name data: JSON encoded data payload
เซิร์ฟเวอร์อาจส่งเหตุการณ์ต่อไปนี้:
ใส่ | ข้อมูลที่เข้ารหัส JSON จะเป็นวัตถุที่มีสองคีย์: เส้นทางและข้อมูล เส้นทางชี้ไปยังตำแหน่งที่สัมพันธ์กับ URL คำขอ ไคลเอนต์ควรแทนที่ข้อมูลทั้งหมดในตำแหน่งนั้นในแคชด้วยข้อมูลที่ระบุในข้อความ |
ปะ | ข้อมูลที่เข้ารหัส JSON จะเป็นวัตถุที่มีสองคีย์: เส้นทางและข้อมูล เส้นทางชี้ไปยังตำแหน่งที่สัมพันธ์กับ URL คำขอ สำหรับแต่ละคีย์ในข้อมูล ไคลเอนต์ควรแทนที่คีย์ที่เกี่ยวข้องในแคชด้วยข้อมูลสำหรับคีย์นั้นในข้อความ |
ให้มีชีวิตอยู่ | ข้อมูลสำหรับเหตุการณ์นี้เป็นโมฆะ ไม่จำเป็นต้องดำเนินการใดๆ |
ยกเลิก | ข้อมูลสำหรับเหตุการณ์นี้เป็นโมฆะ เหตุการณ์นี้จะถูกส่งหากกฎความปลอดภัยของฐานข้อมูลเรียลไทม์ของ Firebase ทำให้การอ่านในตำแหน่งที่ร้องขอไม่ได้รับอนุญาตอีกต่อไป |
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 ซึ่งเป็นโปรแกรมห่อหุ้มของบุคคลที่สามรอบๆ Firebase REST และ Streaming API