กำลังดึงข้อมูล

การอ่านข้อมูลด้วย 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 กับชื่อของคีย์ย่อย ระบบจะจัดเรียงข้อมูลที่มีคีย์ย่อยที่ระบุ ดังนี้

  1. เด็กที่มีค่า null สำหรับคีย์ของเด็กที่ระบุจะแสดงก่อน
  2. จากนั้นจะเป็นเด็กที่มีค่า false สำหรับคีย์ย่อยที่ระบุ หาก บุตรหลายคนมีค่าเป็น false ระบบจะจัดเรียง ตามพจนานุกรมตามคีย์
  3. จากนั้นจะเป็นเด็กที่มีค่า true สำหรับคีย์ย่อยที่ระบุ หาก บุตรหลานหลายคนมีค่าเป็น true ระบบจะจัดเรียงตามพจนานุกรมโดยใช้ คีย์
  4. จากนั้นจะเป็นชื่อที่มีค่าตัวเลข โดยเรียงลำดับจากน้อยไปมาก หากโหนดย่อยหลายรายการ มีค่าตัวเลขเดียวกันสำหรับโหนดย่อยที่ระบุ ระบบจะจัดเรียงตามคีย์
  5. โดยสตริงจะอยู่หลังตัวเลข และจะจัดเรียงตามลำดับตัวอักษรจากน้อยไปมาก หากบุตรหลายคนมีค่าเดียวกันสำหรับโหนดย่อยที่ระบุ ระบบจะจัดเรียงตามพจนานุกรมตามคีย์
  6. ออบเจ็กต์จะอยู่สุดท้ายและจัดเรียงตามพจนานุกรมตามคีย์จากน้อยไปมาก
ระบบจะแสดงผลลัพธ์ที่กรองแล้วโดยไม่มีการจัดเรียง หากลำดับของข้อมูลมีความสำคัญ คุณควรจัดเรียงผลลัพธ์ในแอปพลิเคชันหลังจากที่ระบบส่งข้อมูลจาก Firebase กลับมา

orderBy="$key"

เมื่อใช้พารามิเตอร์ orderBy="$key" เพื่อจัดเรียงข้อมูล ระบบจะแสดงข้อมูล ตามลำดับจากน้อยไปมากตามคีย์ดังนี้ โปรดทราบว่าคีย์ต้องเป็นสตริงเท่านั้น

  1. เด็กที่มีคีย์ที่แยกวิเคราะห์เป็นจำนวนเต็ม 32 บิตได้จะแสดงก่อน โดยเรียงตามลำดับจากน้อยไปมาก
  2. จากนั้นจะเป็นเด็กที่มีค่าสตริงเป็นคีย์ โดยจะจัดเรียงตามลำดับแบบพจนานุกรมจากน้อยไปมาก

orderBy="$value"

เมื่อใช้พารามิเตอร์ orderBy="$value" เพื่อจัดเรียงข้อมูล ระบบจะจัดเรียงองค์ประกอบย่อยตามค่าขององค์ประกอบ เกณฑ์การจัดเรียงจะเหมือนกับข้อมูลที่จัดเรียงตามคีย์ย่อย ยกเว้นจะใช้ค่าของโหนดแทนค่าของคีย์ย่อยที่ระบุ

orderBy="$priority"

เมื่อใช้พารามิเตอร์ orderBy="$priority" เพื่อจัดเรียงข้อมูล ระบบจะกำหนดลำดับของ รายการย่อยตามลำดับความสำคัญและคีย์ดังนี้ โปรดทราบว่าค่าลำดับความสำคัญ ต้องเป็นตัวเลขหรือสตริงเท่านั้น

  1. เด็กที่ไม่มีลำดับความสำคัญ (ค่าเริ่มต้น) จะมาเป็นอันดับแรก
  2. จากนั้นจะเป็นเด็กที่มีหมายเลขเป็นลำดับความสำคัญ โดยจะจัดเรียงตามลำดับความสำคัญจากน้อยไปมาก
  3. เด็กที่มีสตริงเป็นลำดับความสำคัญจะมาเป็นอันดับสุดท้าย ระบบจะจัดเรียงตามลำดับพจนานุกรมตาม ลำดับความสำคัญ
  4. เมื่อใดก็ตามที่รายการโฆษณา 2 รายการมีลำดับความสำคัญเดียวกัน (รวมถึงไม่มีลำดับความสำคัญ) ระบบจะจัดเรียงตามคีย์ คีย์ที่เป็นตัวเลขจะมาเป็นอันดับแรก (จัดเรียงตามตัวเลข) ตามด้วยคีย์ที่เหลือ (จัดเรียงตาม พจนานุกรม)

ดูข้อมูลเพิ่มเติมเกี่ยวกับลำดับความสำคัญได้ที่ การอ้างอิง API

การสตรีมจาก REST API

ปลายทาง REST ของ Firebase รองรับโปรโตคอล EventSource / Server-Sent Events ซึ่งช่วยให้สตรีมการเปลี่ยนแปลงไปยังตำแหน่งเดียวในฐานข้อมูล Firebase ได้อย่างง่ายดาย

หากต้องการเริ่มต้นสตรีม เราจะต้องดำเนินการต่อไปนี้

  1. ตั้งค่าส่วนหัว Accept ของไคลเอ็นต์เป็น text/event-stream
  2. ปฏิบัติตามการเปลี่ยนเส้นทาง HTTP โดยเฉพาะรหัสสถานะ HTTP 307
  3. ใส่พารามิเตอร์การค้นหา 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