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

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

  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 / เหตุการณ์ที่ส่งจากเซิร์ฟเวอร์ ซึ่งทำให้สตรีมการเปลี่ยนแปลงไปยังตำแหน่งเดียวในฐานข้อมูล 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 คีย์ ได้แก่ 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