משחזר נתונים

קריאת נתונים עם GET

אנחנו יכולים לקרוא נתונים ממסד הנתונים Firebase שלנו על ידי הנפקת GET בקשה לנקודת הסיום URL שלה. בואו נמשיך עם דוגמת הבלוג שלנו מהסעיף הקודם ונקרא את כל נתוני הפוסט בבלוג שלנו:

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

בקשה מוצלחת תסומן על ידי 200 OK קוד מצב HTTP, ואת התגובה תכיל את נתון שאנו נחזור אתה.

הוספת פרמטרים של URI

ה- API של REST מקבל מספר פרמטרים של שאילתות בעת קריאת נתונים ממסד הנתונים של Firebase. להלן הפרמטרים הנפוצים ביותר. לרשימה מלאה, עיינו הפנית API REST .

אימות

auth פרמטר בקשה מאפשר גישה לנתונים מוגנים על ידי חוקי מסד Firebase זמן אמת , והוא נתמך על ידי כל סוגי בקשה. הטיעון יכול להיות או הסודי של אפליקצית 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'

התקשר חזרה

כדי לבצע שיחות REST מדפדפן אינטרנט על פני תחומים אתה יכול להשתמש jsonp לעטוף את התגובה בתוך פונקציית callback JavaScript. להוסיף callback= יש את ה- API REST לעטוף את הנתונים שהוחזרו על פונקציית 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 מאפשר לנו לבחור התחלה שרירותית ונקודת סיום לשאילתות שלנו. לדוגמה, אם אנחנו רוצים למצוא את כל הדינוזאורים כי הם לפחות שלושה מטרים גבוה, נוכל לשלב orderBy ו startAt :

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'

אנו יכולים להשתמש endAt למצוא את כל הדינוזאורים ששמותיהם לבוא לפני Pterodactyl lexicographically:

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 עם השם של מפתח ילד, נתונים המכילים את מפתח הבן שצוין יסודר כדלקמן:

  1. ילדים עם null ערך עבור מפתח הבן שצוין לבוא ראשון.
  2. ילדים עם ערך של false עבור מפתח הבן שצוין לבוא הבאים. אם ילדים מרובים יש ערך של false , הם מסודרים lexicographically ידי מפתח.
  3. ילדים עם ערך של true עבור מפתח הבן שצוין לבוא הבאים. אם ילדים מרובים יש ערך של true , הם מסודרים lexicographically ידי מפתח.
  4. ילדים עם ערך מספרי מגיעים אחר כך, ממוינים בסדר עולה. אם למספר ילדים יש אותו ערך מספרי עבור צומת הילד שצוין, הם ממוינים לפי מפתח.
  5. מיתרים באים אחרי מספרים, וממוינים באופן לקסיקוגרפי בסדר עולה. אם למספר ילדים יש ערך זהה לצומת הילדים שצוין, הם מסודרים באופן לקסיקוגרפי לפי מפתח.
  6. החפצים מגיעים אחרונים, וממוינים באופן לקסיקוגרפי לפי מפתח בסדר עולה.
התוצאות המסוננות מוחזרות ללא סדר. אם סדר הנתונים שלך חשוב, עליך למיין את התוצאות ביישום שלך לאחר החזרתם מ- Firebase.

orderBy = "$ key"

בעת שימוש orderBy="$key" פרמטר למיין את הנתונים, הנתונים יוחזרו בסדר עולה לפי המפתח כדלקמן. זכור שמפתחות יכולים להיות רק מיתרים.

  1. ילדים עם מפתח שניתן לנתח כמספר שלם של 32 סיביות במקום הראשון, ממוינים בסדר עולה.
  2. ילדים עם ערך מחרוזת כמפתח הם הבאים, ממוינים באופן לקסיקוגרפי בסדר עולה.

orderBy = "$ value"

בעת שימוש orderBy="$value" פרמטר למיין את הנתונים שלך, הילדים יסודרו על פי ערכם. קריטריוני ההזמנה זהים לנתונים שהוזמנו על ידי מפתח צאצא, למעט הערך של הצומת משמש במקום הערך של מפתח צאתי שצוין.

orderBy = "$ עדיפות"

בעת שימוש orderBy="$priority" פרמטר למיין את נתון שלך, הסידור לילדים נקבע לפי העדיפות והבריח שלהם כדלקמן. זכור כי ערכי עדיפות יכולים להיות רק מספרים או מחרוזות.

  1. ילדים ללא עדיפות (ברירת המחדל) במקום הראשון.
  2. ילדים עם מספר העדיפות שלהם מגיעים אחריהם. הם ממוינים באופן מספרי לפי עדיפות, קטנים עד גדולים.
  3. ילדים עם מחרוזת הם בראש סדר העדיפויות שלהם. הם ממוינים באופן לקסיקוגרפי לפי עדיפות.
  4. בכל פעם שלשני ילדים יש אותה עדיפות (כולל ללא עדיפות), הם ממוינים לפי מפתח. מקשים מספריים במקום הראשון (ממוינים מספרית), ואחריהם המקשים הנותרים (ממוינים באופן לקסיקוגרפי).

לקבלת מידע נוסף על סדרי עדיפויות, לראות את התייחסות API .

סטרימינג מ- REST API

נקודות קצה Firebase REST לתמוך EventSource / ואירועים הנשלחים לשרת פרוטוקול, מה שהופך אותו קל לשינויים בזרם למקום אחד במסד הנתונים Firebase שלנו.

כדי להתחיל עם סטרימינג, נצטרך לבצע את הפעולות הבאות:

  1. הגדר את לקוח יקבל כותרת כדי text/event-stream
  2. כבד הפניות מחדש של HTTP, בפרט קוד מצב HTTP 307
  3. כלול את auth פרמטר השאילתה אם המיקום מסד Firebase דורש הרשאה לקרוא

בתמורה, השרת ישלח אירועים בשם כשמצב הנתונים בכתובת ה- URL המבוקשת משתנה. המבנה של הודעות אלה תואם לפרוטוקול EventSource:

event: event name
data: JSON encoded data payload

השרת עשוי לשלוח את האירועים הבאים:

לָשִׂים הנתונים המקודדים JSON יהיו אובייקט עם שני מקשים: נתיב ונתונים
הנתיב מצביע על מיקום יחסית לכתובת האתר של הבקשה
הלקוח צריך להחליף את כל הנתונים באותו מקום במטמון שלו בנתונים המופיעים בהודעה
תיקון הנתונים המקודדים JSON יהיו אובייקט עם שני מקשים: נתיב ונתונים
הנתיב מצביע על מיקום ביחס לכתובת האתר של הבקשה
עבור כל מפתח בנתונים, הלקוח צריך להחליף את המפתח המתאים במטמון שלו בנתונים עבור אותו מפתח בהודעה
להשאיר בחיים הנתונים לאירוע זה אינם ברורים, אין צורך לבצע פעולה
לְבַטֵל הנתונים לאירוע זה הם אפסים
אירוע זה יישלח אם כללי מסד הנתונים בזמן אמת של Firebase גורמים לכך שלא ניתן יהיה עוד לקרוא במקום המבוקש
אות_בוטל הנתונים עבור אירוע זה הם מחרוזת המציינת שתוקף האישור פג
אירוע זה יישלח כאשר פרמטר האימות שסופק כבר אינו תקף

להלן דוגמה לקבוצת אירועים שהשרת עשוי לשלוח:

// 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 , עטיפה של צד שלישי ברחבי REST Firebase ו- APIs ההזרמה.