تتيح Firebase Hosting واجهة برمجة تطبيقات REST عمليات نشر آلية وقابلة للتخصيص على مواقعك الإلكترونية المستضافة على Firebase. استخدِم واجهة برمجة تطبيقات REST هذه لنشر محتوى Hosting وإعدادات جديدة أو معدَّلة.
كبديل لاستخدام Firebase CLI لعمليات النشر، يمكنك استخدام واجهة برمجة تطبيقات REST Firebase Hosting لإنشاء version جديد من مواد العرض لموقعك الإلكتروني بشكل آلي، ثم تحميل الملفات إلى الإصدار، ثم نشر الإصدار على موقعك الإلكتروني.
على سبيل المثال، باستخدام واجهة برمجة تطبيقات REST الخاصة بـ Firebase Hosting، يمكنك إجراء ما يلي:
جدولة عمليات النشر : باستخدام واجهة برمجة تطبيقات REST مع مهمة cron، يمكنك تغيير المحتوى المستضاف على استضافة Firebase وفقًا لجدول زمني منتظم (على سبيل المثال، لتفعيل إصدار خاص بالعطلة أو مرتبط بحدث معيّن من المحتوى).
التكامل مع أدوات المطوّرين : يمكنك إنشاء خيار في أداتك لنشر مشاريع تطبيق الويب على Firebase Hosting بنقرة واحدة فقط (على سبيل المثال، النقر على زر النشر في بيئة تطوير متكاملة).
أتمتة عمليات النشر عند إنشاء محتوى ثابت : عندما تنشئ عملية محتوى ثابتًا بشكل برمجية (على سبيل المثال، محتوى من إنشاء المستخدمين، مثل موقع wiki أو مقالة إخبارية)، يمكنك نشر المحتوى الذي تم إنشاؤه كملفات ثابتة بدلاً من عرضه بشكل ديناميكي. يوفّر لك ذلك قدرة حوسبة باهظة الثمن ويعرض ملفاتك بطريقة أكثر قابلية للتوسّع.
يشرح هذا الدليل أولاً كيفية تفعيل واجهة برمجة التطبيقات ومصادقتها ومنح الإذن لها. بعد ذلك، يشرح الدليل مثالاً لإنشاء Firebase Hosting إصدار، وتحميل الملفات المطلوبة إلى الإصدار، ثم نشر الإصدار أخيرًا.
يمكنك أيضًا الاطّلاع على مزيد من المعلومات حول واجهة برمجة تطبيقات REST هذه في مستندات مرجع واجهة برمجة تطبيقات REST الكاملة.Hosting
قبل البدء: تفعيل واجهة برمجة تطبيقات REST
عليك تفعيل واجهة برمجة تطبيقات REST الخاصة بـ Firebase Hosting في Google APIs console:
افتح صفحة Firebase Hosting API في Google APIs console.
عندما يُطلب منك ذلك، اختَر مشروع Firebase.
انقر على تفعيل في صفحة Firebase Hosting API.
الخطوة 1: الحصول على رمز دخول لمصادقة طلبات واجهة برمجة التطبيقات ومنح الإذن لها
تتيح مشاريع Firebase استخدام حسابات الخدمة من Google، التي يمكنك استخدامها لاستدعاء واجهات برمجة تطبيقات خادم Firebase من خادم تطبيقك أو بيئتك الموثوق بها. إذا كنت تطوّر رمزًا برمجيًا محليًا أو تنشر تطبيقك في مقرّك، يمكنك استخدام بيانات الاعتماد التي تم الحصول عليها باستخدام حساب الخدمة هذا لمنح الإذن لطلبات الخادم.
يمكنك الاطّلاع على جميع حسابات الخدمة لمشروعك على Firebase في علامة التبويب
لمصادقة حساب خدمة ومنحه الإذن بالوصول إلى خدمات Firebase، عليك إنشاء ملف مفتاح خاص بتنسيق JSON.
لإنشاء ملف مفتاح خاص لحساب الخدمة، اتّبِع الخطوات التالية:
في وحدة تحكّم Firebase، انتقِل إلى علامة التبويب
الإعدادات > حسابات الخدمة.انقر على إنشاء مفتاح خاص جديد، ثم أكِّد من خلال النقر على إنشاء مفتاح.
خزِّن ملف JSON الذي يحتوي على المفتاح بشكل آمن.
استخدِم بيانات اعتماد Firebase مع مكتبة Google Auth Library للغة المفضّلة لاسترداد رمز دخول قصير الأجل إلى OAuth 2.0:
node.js
const {google} = require('googleapis'); function getAccessToken() { return new Promise(function(resolve, reject) { var key = require('./service-account.json'); var jwtClient = new google.auth.JWT( key.client_email, null, key.private_key, SCOPES, null ); jwtClient.authorize(function(err, tokens) { if (err) { reject(err); return; } resolve(tokens.access_token); }); }); }
في هذا المثال، تصادق مكتبة عميل Google API الطلب باستخدام JSON web token أو JWT. لمزيد من المعلومات، اطّلِع على رموز JSON المميزة للويب.
Python
def _get_access_token(): """Retrieve a valid access token that can be used to authorize requests. :return: Access token. """ credentials = ServiceAccountCredentials.from_json_keyfile_name( 'service-account.json', SCOPES) access_token_info = credentials.get_access_token() return access_token_info.access_token
Java
private static String getAccessToken() throws IOException { GoogleCredential googleCredential = GoogleCredential .fromStream(new FileInputStream("service-account.json")) .createScoped(Arrays.asList(SCOPES)); googleCredential.refreshToken(); return googleCredential.getAccessToken(); }
بعد انتهاء صلاحية رمز الدخول، يتم استدعاء طريقة إعادة تحميل الرمز تلقائيًا لاسترداد رمز دخول محدَّث.
Firebase Hostingالخطوة 2: التأكّد من أنّ مشروعك يتضمّن موقعًا إلكترونيًا تلقائيًا Hosting
قبل عملية النشر الأولى على Firebase Hosting، يجب أن يتضمّن مشروعك على Firebase موقعًا إلكترونيًا Hosting تلقائيًا SITE.
تحقَّق ممّا إذا كان مشروعك يتضمّن موقعًا إلكترونيًا تلقائيًا Hosting من خلال استدعاء
sites.listنقطة النهاية.على سبيل المثال:
أمر cURL
curl -H "Content-Type: application/json" \ -H "Authorization: Bearer ACCESS_TOKEN" \ https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID/sitesطلب HTTPS غير مُعدَّل
Host: firebasehosting.googleapis.com POST /v1beta1/projects/PROJECT_ID/sites HTTP/1.1 Authorization: Bearer ACCESS_TOKEN Content-Type: application/json
إذا كان أحد المواقع الإلكترونية يتضمّن
"type": "DEFAULT_SITE"، يعني ذلك أنّ مشروعك يتضمّن موقعًا إلكترونيًا تلقائيًا Hosting للاستضافة. تخطَّ بقية هذه الخطوة، وانتقِل إلى الخطوة التالية: إنشاء إصدار جديد لموقعك الإلكتروني.إذا ظهرت لك مصفوفة فارغة، يعني ذلك أنّه ليس لديك موقع إلكتروني تلقائي Hosting أكمِل بقية هذه الخطوة.
حدِّد
SITE_IDلموقعك الإلكترائي التلقائي Hosting. ضَع في اعتبارك ما يلي عند تحديدSITE_IDهذا:يتم استخدام
SITE_IDهذا لإنشاء النطاقات الفرعية التلقائية على Firebase:
وSITE_ID.web.app .SITE_ID.firebaseapp.comيجب أن يستوفي
SITE_IDالمتطلبات التالية:- يجب أن يكون اسم مضيف صالحًا، ما يعني أنّه لا يمكن أن يحتوي على
.أو_وما إلى ذلك. - يجب أن يتألف من 30 حرفًا أو أقل
- يجب أن يكون فريدًا على مستوى العالم في Firebase
- يجب أن يكون اسم مضيف صالحًا، ما يعني أنّه لا يمكن أن يحتوي على
يُرجى العِلم أنّنا ننصح غالبًا باستخدام رقم تعريف مشروعك كـ
SITE_IDلموقعك الإلكتروني التلقائي Hosting. تعرَّف على كيفية العثور على رقم التعريف هذا في مقالة التعرّف على مشاريع Firebase.أنشِئ موقعك الإلكتروني التلقائي Hosting من خلال استدعاء
sites.createنقطة النهاية باستخدامSITE_IDكالمَعلمةsiteId.على سبيل المثال:
أمر cURL
curl -H "Content-Type: application/json" \ -H "Authorization: Bearer ACCESS_TOKEN" \ https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID/sites?siteId=SITE_IDطلب HTTPS غير مُعدَّل
Host: firebasehosting.googleapis.com POST /v1beta1/projects/PROJECT_ID/sites?siteId=SITE_ID Authorization: Bearer ACCESS_TOKEN Content-Type: application/json
يعرض طلب بيانات من واجهة برمجة التطبيقات هذا إلى
sites.createملف JSON التالي:{ "name": "projects/PROJECT_ID/sites/SITE_ID", "defaultUrl": "https://SITE_ID.web.app", "type": "DEFAULT_SITE" }
الخطوة 3: إنشاء إصدار جديد لموقعك الإلكتروني
أول طلب بيانات من واجهة برمجة التطبيقات ترسله هو إنشاء
Version جديد لموقعك الإلكتروني.
في وقت لاحق من هذا الدليل، ستحمِّل الملفات إلى هذا الإصدار، ثم تنشره على موقعك الإلكتروني.
حدِّد SITE_ID للموقع الإلكتروني الذي تريد النشر عليه.
استدعِ نقطة النهاية versions.create باستخدام SITE_ID في الاستدعاء.
(اختياري) يمكنك أيضًا تمرير كائن Firebase Hosting إعدادات في الاستدعاء، بما في ذلك ضبط عنوان يخزّن مؤقتًا جميع الملفات لفترة زمنية محدّدة.
على سبيل المثال:
أمر cURL
curl -H "Content-Type: application/json" \ -H "Authorization: Bearer ACCESS_TOKEN" \ -d '{ "config": { "headers": [{ "glob": "**", "headers": { "Cache-Control": "max-age=1800" } }] } }' \ https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versionsطلب HTTPS غير مُعدَّل
Host: firebasehosting.googleapis.com POST /v1beta1/sites/SITE_ID/versions HTTP/1.1 Authorization: Bearer ACCESS_TOKEN Content-Type: application/json Content-Length: 134 { "config": { "headers": [{ "glob": "**", "headers": { "Cache-Control": "max-age=1800" } }] } }
يعرض طلب بيانات من واجهة برمجة التطبيقات هذا إلى versions.create ملف JSON التالي:
{
"name": "sites/SITE_ID/versions/VERSION_ID",
"status": "CREATED",
"config": {
"headers": [{
"glob": "**",
"headers": {
"Cache-Control": "max-age=1800"
}
}]
}
}تحتوي هذه الاستجابة على معرّف فريد للإصدار الجديد، بالتنسيق:
sites/SITE_ID/versions/VERSION_ID. ستحتاج إلى هذا المعرّف الفريد طوال هذا الدليل للإشارة إلى هذا الإصدار تحديدًا.
الخطوة 4: تحديد قائمة الملفات التي تريد نشرها
بعد الحصول على معرّف الإصدار الجديد، عليك إخبار Firebase Hosting بالملفات التي تريد نشرها في هذا الإصدار الجديد.
يُرجى العِلم أنّ Hosting تفرض حدًا أقصى لحجم الملفات الفردية يبلغ 2 غيغابايت لـ.
تتطلب واجهة برمجة التطبيقات هذه تحديد الملفات باستخدام تجزئة SHA256. لذا، قبل إجراء طلب واجهة برمجة التطبيقات، عليك أولاً حساب تجزئة لكل ملف ثابت من خلال ضغط الملفات باستخدام Gzip، ثم الحصول على تجزئة SHA256 لكل ملف مضغوط حديثًا.
لنواصل المثال، لنفترض أنّك تريد نشر ثلاثة ملفات في الإصدار الجديد: file1 وfile2 وfile3.
اضغط الملفات باستخدام Gzip:
gzip file1 && gzip file2 && gzip file3
أصبح لديك الآن ثلاثة ملفات مضغوطة:
file1.gzوfile2.gzوfile3.gz.احصل على تجزئة SHA256 لكل ملف مضغوط:
cat file1.gz | openssl dgst -sha256 66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4
cat file2.gz | openssl dgst -sha256 490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083
cat file3.gz | openssl dgst -sha256 59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315
أصبح لديك الآن تجزئات SHA256 الثلاثة للملفات المضغوطة الثلاثة.
أرسِل هذه التجزئات الثلاث في طلب بيانات من واجهة برمجة التطبيقات إلى نقطة النهاية
versions.populateFiles. أدرِج كل تجزئة حسب المسار المطلوب للملف الذي تم تحميله (في هذا المثال،/file1،/file2، و/file3).على سبيل المثال:
أمر cURL
$ curl -H "Content-Type: application/json" \ -H "Authorization: Bearer ACCESS_TOKEN" \ -d '{ "files": { "/file1": "66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4", "/file2": "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083", "/file3": "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315" } }' \ https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions/VERSION_ID:populateFilesطلب HTTPS غير مُعدَّل
Host: firebasehosting.googleapis.com POST /v1beta1/sites/SITE_ID/versions/VERSION_ID:populateFiles HTTP/1.1 Authorization: Bearer ACCESS_TOKEN Content-Type: application/json Content-Length: 181 { "files": { "/file1": "66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4", "/file2": "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083", "/file3": "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315" } }
يعرض طلب بيانات من واجهة برمجة التطبيقات هذا إلى versions.populateFiles ملف JSON التالي:
{ "uploadRequiredHashes": [ "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083", "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315" ], "uploadUrl": "https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files" }
تتضمّن هذه الاستجابة ما يلي:
تجزئة كل ملف يجب تحميله. على سبيل المثال، في هذا المثال، سبق تحميل
file1في إصدار سابق، لذا لم يتم تضمين تجزئته في قائمةuploadRequiredHashes.uploadUrlالخاص بالإصدار الجديد.
في الخطوة التالية لتحميل الملفَين الجديدَين، ستحتاج إلى التجزئات وuploadURL من استجابة versions.populateFiles.
الخطوة 5: تحميل الملفات المطلوبة
عليك تحميل كل ملف مطلوب على حدة (الملفات المُدرَجة في uploadRequiredHashes من استجابة versions.populateFiles في الخطوة السابقة). لعمليات تحميل الملفات هذه، ستحتاج إلى تجزئات الملفات وuploadUrl من الخطوة السابقة.
ألحِق شرطة مائلة وتجزئة الملف بـ
uploadUrlلـ إنشاء عنوان URL خاص بالملف بالتنسيق:https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH.حمِّل جميع الملفات المطلوبة واحدًا تلو الآخر (في هذا المثال،
file2.gzوfile3.gzفقط) إلى عنوان URL الخاص بالملف باستخدام سلسلة من الطلبات.على سبيل المثال، لتحميل الملف المضغوط
file2.gz:أمر cURL
curl -H "Authorization: Bearer ACCESS_TOKEN" \ -H "Content-Type: application/octet-stream" \ --data-binary @./file2.gz \ https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASHطلب HTTPS غير مُعدَّل
Host: upload-firebasehosting.googleapis.com POST /upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH HTTP/1.1 Authorization: Bearer ACCESS_TOKEN Content-Type: application/octet-stream Content-Length: 500 content-of-file2.gz
تعرض عمليات التحميل الناجحة استجابة HTTPS برمز 200 OK.
الخطوة 6: تعديل حالة الإصدار إلى FINALIZED
بعد تحميل جميع الملفات المُدرَجة في استجابة versions.populateFiles، يمكنك تعديل حالة الإصدار إلى FINALIZED.
استدعِ versions.patch نقطة النهاية مع الحقل status في طلب بيانات من واجهة برمجة التطبيقات على FINALIZED.
على سبيل المثال:
أمر cURL
curl -H "Content-Type: application/json" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-X PATCH \
-d '{"status": "FINALIZED"}' \
https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions/VERSION_ID?update_mask=status
طلب HTTPS غير مُعدَّل
Host: firebasehosting.googleapis.com
PATCH /v1beta1/sites/SITE_ID/versions/VERSION_ID?update_mask=status HTTP/1.1
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
Content-Length: 23
{"status": "FINALIZED"}يعرض طلب بيانات من واجهة برمجة التطبيقات هذا إلى versions.patch ملف JSON التالي. تأكَّد من تعديل status إلى FINALIZED.
{ "name": "sites/SITE_ID/versions/VERSION_ID", "status": "FINALIZED", "config": { "headers": [{ "glob": "**", "headers": {"Cache-Control": "max-age=1800"} }] }, "createTime": "2018-12-02T13:41:56.905743Z", "createUser": { "email": "SERVICE_ACCOUNT_EMAIL@SITE_ID.iam.gserviceaccount.com" }, "finalizeTime": "2018-12-02T14:56:13.047423Z", "finalizeUser": { "email": "USER_EMAIL@DOMAIN.tld" }, "fileCount": "5", "versionBytes": "114951" }
الخطوة 7: نشر الإصدار
بعد الحصول على إصدار نهائي، انشره. في هذه الخطوة،
عليك إنشاء
Release من الإصدار
الذي يتضمّن إعدادات الاستضافة وجميع ملفات المحتوى للإصدار الجديد.
استدعِ نقطة النهاية releases.create
لإنشاء الإصدار.
على سبيل المثال:
أمر cURL
curl -H "Authorization: Bearer ACCESS_TOKEN" \
-X POST
https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/releases?versionName=sites/SITE_ID/versions/VERSION_ID
طلب HTTPS غير مُعدَّل
Host: firebasehosting.googleapis.com POST /v1beta1/sites/SITE_ID/releases?versionName=sites/SITE_ID/versions/VERSION_ID HTTP/1.1 Authorization: Bearer ACCESS_TOKEN
يعرض طلب بيانات من واجهة برمجة التطبيقات هذا إلى releases.create ملف JSON التالي:
{ "name": "sites/SITE_ID/releases/RELEASE_ID", "version": { "name": "sites/SITE_ID/versions/VERSION_ID", "status": "FINALIZED", "config": { "headers": [{ "glob": "**", "headers": {"Cache-Control": "max-age=1800"} }] } }, "type": "DEPLOY", "releaseTime": "2018-12-02T15:14:37Z" }
يجب الآن نشر إعدادات الاستضافة وجميع ملفات الإصدار الجديد على موقعك الإلكتروني، ويمكنك الوصول إلى ملفاتك باستخدام عناوين URL التالية:
https://SITE_ID.web.app/file1https://SITE_ID.web.app/file2https://SITE_ID.web.app/file3
يمكن أيضًا الوصول إلى هذه الملفات على عناوين URL المرتبطة بنطاقك
SITE_ID.firebaseapp.com.
يمكنك أيضًا الاطّلاع على الإصدار الجديد مُدرَجًا في الـ Hosting dashboard of the Firebase console.