تتيح Firebase Hosting REST API عمليات نشر قابلة للتخصيص وآلية لمواقعك الإلكترونية المستضافة على Firebase. استخدِم واجهة REST API هذه لنشر محتوى Hosting جديد أو معدَّل وإعدادات جديدة أو معدَّلة.
كبديل لاستخدام Firebase CLI في عمليات النشر، يمكنك استخدام واجهة برمجة التطبيقات Firebase Hosting REST لإنشاء version
جديد من مواد العرض لموقعك الإلكتروني بشكل آلي، ثم تحميل الملفات إلى الإصدار، ثم نشر الإصدار على موقعك الإلكتروني.
على سبيل المثال، باستخدام واجهة برمجة التطبيقات Firebase Hosting REST، يمكنك إجراء ما يلي:
جدولة عمليات النشر: باستخدام واجهة REST API مع مهمة cron، يمكنك تغيير المحتوى المستضاف على Firebase وفقًا لجدول زمني منتظم (على سبيل المثال، لنشر نسخة خاصة من المحتوى بمناسبة عطلة أو حدث).
الدمج مع أدوات المطوّرين: يمكنك إنشاء خيار في أداتك لنشر مشاريع تطبيقات الويب على Firebase Hosting بنقرة واحدة فقط (على سبيل المثال، النقر على زر النشر داخل بيئة تطوير متكاملة).
أتمتة عمليات النشر عند إنشاء محتوى ثابت: عندما تنشئ عملية محتوًى ثابتًا آليًا (على سبيل المثال، محتوى من إنشاء المستخدمين، مثل ويكي أو مقالة إخبارية)، يمكنك نشر المحتوى الذي تم إنشاؤه كملفات ثابتة بدلاً من عرضه بشكل ديناميكي. يوفّر لك ذلك طاقة حوسبة باهظة الثمن ويساعدك في عرض ملفاتك بطريقة أكثر قابلية للتوسّع.
يوضّح هذا الدليل أولاً كيفية تفعيل واجهة برمجة التطبيقات والمصادقة عليها ومنح الإذن باستخدامها. بعد ذلك، يقدّم هذا الدليل مثالاً لإنشاء Firebase Hostingإصدار، وتحميل الملفات المطلوبة إلى الإصدار، ثم نشره.
يمكنك أيضًا الاطّلاع على مزيد من المعلومات حول واجهة REST API هذه في مستندات Hosting REST API المرجعية الكاملة.
قبل البدء: تفعيل واجهة برمجة تطبيقات REST
يجب تفعيل واجهة Firebase Hosting REST API في وحدة تحكّم Google APIs:
افتح صفحة واجهة برمجة التطبيقات Firebase Hosting في وحدة تحكّم Google APIs.
عندما يُطلب منك ذلك، اختَر مشروعك على Firebase.
انقر على تفعيل في صفحة واجهة برمجة التطبيقات Firebase Hosting.
الخطوة 1: الحصول على رمز دخول لمصادقة طلبات واجهة برمجة التطبيقات والسماح بها
تتيح مشاريع Firebase استخدام حسابات الخدمة من Google، والتي يمكنك استخدامها لاستدعاء واجهات برمجة التطبيقات لخادم Firebase من خادم تطبيقك أو بيئتك الموثوق بها. إذا كنت بصدد تطوير رمز برمجي محليًا أو نشر تطبيقك في الموقع، يمكنك استخدام بيانات الاعتماد التي تم الحصول عليها من خلال حساب الخدمة هذا لتفويض طلبات الخادم.
لإثبات هوية حساب الخدمة ومنحه الإذن بالوصول إلى خدمات Firebase، عليك إنشاء ملف مفتاح خاص بتنسيق JSON.
لإنشاء ملف مفتاح خاص لحساب الخدمة، اتّبِع الخطوات التالية:
في وحدة تحكّم Firebase، افتح الإعدادات > حسابات الخدمة.
انقر على إنشاء مفتاح خاص جديد، ثم أكِّد ذلك بالنقر على إنشاء مفتاح.
تخزين ملف JSON الذي يحتوي على المفتاح بشكل آمن
استخدِم بيانات اعتماد Firebase مع مكتبة Google Auth للغتك المفضّلة من أجل استرداد رمز وصول قصير الأمد عبر بروتوكول OAuth 2.0:
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، أو JWT. لمزيد من المعلومات، يُرجى الاطّلاع على رموز الويب المميّزة JSON.
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
private static String getAccessToken() throws IOException { GoogleCredential googleCredential = GoogleCredential .fromStream(new FileInputStream("service-account.json")) .createScoped(Arrays.asList(SCOPES)); googleCredential.refreshToken(); return googleCredential.getAccessToken(); }
بعد انتهاء صلاحية رمز الدخول المميز، يتم استدعاء طريقة إعادة تحميل الرمز المميز تلقائيًا لاسترداد رمز دخول مميز معدَّل.
الخطوة 2: التأكّد من أنّ مشروعك يتضمّن Hosting موقعًا إلكترونيًا تلقائيًا
قبل نشر تطبيقك لأول مرة على Firebase Hosting، يجب أن يتضمّن مشروعك على Firebase
Hosting SITE
تلقائيًا.
تحقَّق مما إذا كان مشروعك يتضمّن موقعًا إلكترونيًا تلقائيًا Hosting من خلال استدعاء نقطة النهاية
sites.list
.على سبيل المثال:
curl -H "Content-Type: application/json" \ -H "Authorization: Bearer
ACCESS_TOKEN " \ https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID /sitesHost: firebasehosting.googleapis.com POST /v1beta1/projects/
PROJECT_ID /sites HTTP/1.1 Authorization: BearerACCESS_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 -H "Content-Type: application/json" \ -H "Authorization: Bearer
ACCESS_TOKEN " \ https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID /sites?siteId=SITE_ID Host: firebasehosting.googleapis.com POST /v1beta1/projects/
PROJECT_ID /sites?siteId=SITE_ID Authorization: BearerACCESS_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 -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 /versionsHost: firebasehosting.googleapis.com POST /v1beta1/sites/
SITE_ID /versions HTTP/1.1 Authorization: BearerACCESS_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 -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 :populateFilesHost: firebasehosting.googleapis.com POST /v1beta1/sites/
SITE_ID /versions/VERSION_ID :populateFiles HTTP/1.1 Authorization: BearerACCESS_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 -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 Host: upload-firebasehosting.googleapis.com POST /upload/sites/
SITE_ID /versions/VERSION_ID /files/FILE_HASH HTTP/1.1 Authorization: BearerACCESS_TOKEN Content-Type: application/octet-stream Content-Length: 500content-of-file2.gz
تعرض عمليات التحميل الناجحة استجابة HTTPS 200 OK
.
الخطوة 6: تعديل حالة الإصدار إلى FINALIZED
بعد تحميل جميع الملفات المُدرَجة في رد versions.populateFiles
، يمكنك تعديل حالة الإصدار إلى FINALIZED
.
استدعِ نقطة النهاية versions.patch
مع ضبط الحقل status
في طلب البيانات من واجهة برمجة التطبيقات على FINALIZED
.
على سبيل المثال:
curl -H "Content-Type: application/json" \ -H "Authorization: BearerACCESS_TOKEN " \ -X PATCH \ -d '{"status": "FINALIZED"}' \ https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID /versions/VERSION_ID ?update_mask=status
Host: firebasehosting.googleapis.com PATCH /v1beta1/sites/SITE_ID /versions/VERSION_ID ?update_mask=status HTTP/1.1 Authorization: BearerACCESS_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 -H "Authorization: BearerACCESS_TOKEN " \ -X POST https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID /releases?versionName=sites/SITE_ID /versions/VERSION_ID
Host: firebasehosting.googleapis.com POST /v1beta1/sites/SITE_ID /releases?versionName=sites/SITE_ID /versions/VERSION_ID HTTP/1.1 Authorization: BearerACCESS_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/file1
https://SITE_ID.web.app/file2
https://SITE_ID.web.app/file3
يمكن أيضًا الوصول إلى هذه الملفات من خلال عناوين URL مرتبطة بنطاق SITE_ID.firebaseapp.com
.
يمكنك أيضًا الاطّلاع على إصدارك الجديد في لوحة بيانات Hosting في وحدة تحكّم Firebase.