قراءة البيانات باستخدام 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 ، وهي مدعومة من قبل جميع أنواع الطلبات. يمكن أن تكون الوسيطة إما سر تطبيق 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 لالتفاف الاستجابة في وظيفة رد اتصال 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
اختيار نقاط بداية ونهاية عشوائية لاستعلاماتنا. على سبيل المثال، إذا أردنا العثور على جميع الديناصورات التي يبلغ طولها ثلاثة أمتار على الأقل، فيمكننا الجمع بين orderBy
و startAt
:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'
يمكننا استخدام endAt
للعثور على جميع الديناصورات التي تأتي أسماؤها قبل الزاحف المجنح من الناحية المعجمية:
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"
لفرز بياناتك، سيتم إرجاع البيانات بترتيب تصاعدي حسب المفتاح كما يلي. ضع في اعتبارك أن المفاتيح يمكن أن تكون عبارة عن سلاسل فقط.
- الأطفال الذين لديهم مفتاح يمكن تحليله كعدد صحيح 32 بت يأتي أولاً، ويتم فرزهم بترتيب تصاعدي.
- يأتي بعد ذلك الأطفال الذين لديهم قيمة سلسلة كمفتاح، ويتم فرزهم بشكل معجمي بترتيب تصاعدي.
ترتيب حسب = "قيمة $"
عند استخدام المعلمة orderBy="$value"
لفرز بياناتك، سيتم ترتيب الأطفال حسب قيمتهم. معايير الترتيب هي نفس البيانات التي يتم ترتيبها بواسطة مفتاح فرعي، باستثناء قيمة العقدة المستخدمة بدلاً من قيمة مفتاح فرعي محدد.
ترتيب حسب = "$ الأولوية"
عند استخدام المعلمة 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 Realtime في عدم السماح بالقراءة في الموقع المطلوب |
auth_revoced | بيانات هذا الحدث عبارة عن سلسلة تشير إلى انتهاء صلاحية بيانات الاعتماد سيتم إرسال هذا الحدث عندما تصبح معلمة المصادقة المقدمة غير صالحة |
فيما يلي مثال لمجموعة الأحداث التي قد يرسلها الخادم:
// 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 وواجهات برمجة تطبيقات البث.