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

การอ่านข้อมูลด้วย GET

เราอ่านข้อมูลจากฐานข้อมูล Firebase ได้โดยส่งคําขอ GET ไปยัง URL ปลายทาง มาต่อจากตัวอย่างบล็อกจากส่วนก่อนหน้าและอ่านข้อมูลบล็อกโพสต์ทั้งหมดกัน

curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=pretty'

คำขอที่สำเร็จจะแสดงด้วยรหัสสถานะ HTTP 200 OK และการตอบกลับจะมีข้อมูลที่เราจะดึงข้อมูล

การเพิ่มพารามิเตอร์ URI

REST API ยอมรับพารามิเตอร์การค้นหาหลายรายการเมื่ออ่านข้อมูลจากฐานข้อมูล Firebase พารามิเตอร์ที่ใช้กันมากที่สุดมีดังนี้ หากต้องการดูรายการทั้งหมด โปรดดูที่เอกสารอ้างอิง API ของ REST

การตรวจสอบสิทธิ์

พารามิเตอร์คำขอ 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 ตัดข้อมูลที่ได้รับไว้ในฟังก์ชันการเรียกกลับที่คุณระบุ เช่น

<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 ด้าน ตัวอย่างต่อไปนี้ค้นหาไดโนเสาร์ทุกตัวที่ชื่อขึ้นต้นด้วย "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 / เหตุการณ์ที่ส่งจากเซิร์ฟเวอร์ ซึ่งทำให้สตรีมการเปลี่ยนแปลงไปยังตำแหน่งเดียวในฐานข้อมูล 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 คีย์ ได้แก่ path และ data
Path จะชี้ไปยังตำแหน่งที่สัมพันธ์กับ URL คำขอ
สำหรับคีย์แต่ละรายการในข้อมูลนั้น ลูกค้าควรแทนที่คีย์ที่เกี่ยวข้องในแคชด้วยข้อมูลสำหรับคีย์นั้นในข้อความ
Keep-alive ข้อมูลของเหตุการณ์นี้มีค่าเป็น Null คุณจึงไม่ต้องดําเนินการใดๆ
ยกเลิก ข้อมูลของเหตุการณ์นี้เป็นค่า 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