النشر إلى موقعك الإلكتروني باستخدام واجهة برمجة تطبيقات Hosting REST

تتيح 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:

  1. افتح صفحة واجهة برمجة التطبيقات Firebase Hosting في وحدة تحكّم Google APIs.

  2. عندما يُطلب منك ذلك، اختَر مشروعك على Firebase.

  3. انقر على تفعيل في صفحة واجهة برمجة التطبيقات Firebase Hosting.

الخطوة 1: الحصول على رمز دخول لمصادقة طلبات واجهة برمجة التطبيقات والسماح بها

تتيح مشاريع Firebase استخدام حسابات الخدمة من Google، والتي يمكنك استخدامها لاستدعاء واجهات برمجة التطبيقات لخادم Firebase من خادم تطبيقك أو بيئتك الموثوق بها. إذا كنت بصدد تطوير رمز برمجي محليًا أو نشر تطبيقك في الموقع، يمكنك استخدام بيانات الاعتماد التي تم الحصول عليها من خلال حساب الخدمة هذا لتفويض طلبات الخادم.

لإثبات هوية حساب الخدمة ومنحه الإذن بالوصول إلى خدمات Firebase، عليك إنشاء ملف مفتاح خاص بتنسيق JSON.

لإنشاء ملف مفتاح خاص لحساب الخدمة، اتّبِع الخطوات التالية:

  1. في وحدة تحكّم Firebase، افتح الإعدادات > حسابات الخدمة.

  2. انقر على إنشاء مفتاح خاص جديد، ثم أكِّد ذلك بالنقر على إنشاء مفتاح.

  3. تخزين ملف JSON الذي يحتوي على المفتاح بشكل آمن

استخدِم بيانات اعتماد Firebase مع مكتبة Google Auth للغتك المفضّلة من أجل استرداد رمز وصول قصير الأمد عبر بروتوكول OAuth 2.0:

node.jsPythonJava
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 تلقائيًا.

  1. تحقَّق مما إذا كان مشروعك يتضمّن موقعًا إلكترونيًا تلقائيًا Hosting من خلال استدعاء نقطة النهاية sites.list.

    على سبيل المثال:

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
    
    https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID/sites
    
    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. أكمِل الخطوات المتبقية من هذه الخطوة.

  2. حدِّد SITE_ID لموقعك التلقائي Hosting. يجب مراعاة ما يلي عند تحديد هذا SITE_ID:

    • يُستخدَم هذا SITE_ID لإنشاء النطاقات الفرعية التلقائية في Firebase:
      SITE_ID.web.app و SITE_ID.firebaseapp.com.

    • يجب أن يستوفي SITE_ID المتطلبات التالية:

      • يجب أن يكون تصنيف اسم مضيف صالحًا، ما يعني أنّه لا يمكن أن يحتوي على . أو _ أو غير ذلك.
      • يجب ألا يزيد عدد الأحرف عن 30 حرفًا.
      • يجب أن يكون المعرّف فريدًا على مستوى العالم في Firebase

    يُرجى العِلم أنّنا ننصح غالبًا باستخدام رقم تعريف مشروعك كـ SITE_ID لموقعك الإلكتروني التلقائي Hosting. تعرَّف على كيفية العثور على هذا المعرّف في مقالة التعرّف على مشاريع Firebase.

  3. أنشئ موقع 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: 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 جديد لموقعك الإلكتروني. في وقت لاحق من هذا الدليل، ستحمّل الملفات إلى هذا الإصدار، ثم ستنشره على موقعك الإلكتروني.

  1. حدِّد SITE_ID للموقع الإلكتروني الذي تريد نشر التطبيق عليه.

  2. اتّصِل بنقطة النهاية 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/versions
    
    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.

  1. اضغط الملفات باستخدام Gzip:

    gzip file1 && gzip file2 && gzip file3

    لديك الآن ثلاثة ملفات مضغوطة file1.gz وfile2.gz وfile3.gz.

  2. احصل على تجزئة SHA256 لكل ملف مضغوط:

    cat file1.gz | openssl dgst -sha256
    
    66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4
    
    cat file2.gz | openssl dgst -sha256
    
    490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083
    
    cat file3.gz | openssl dgst -sha256
    
    59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315
    

    أصبحت لديك الآن ثلاث تجزئات SHA256 لثلاثة ملفات مضغوطة.

  3. أرسِل هذه الرموز الثلاثة في طلب إلى واجهة برمجة التطبيقات لنقطة النهاية 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:populateFiles
    
    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 من الخطوة السابقة.

  1. أضِف شرطة مائلة للأمام وتجزئة الملف إلى uploadUrl لإنشاء عنوان URL خاص بالملف بالتنسيق: https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH.

  2. حمِّل جميع الملفات المطلوبة واحدًا تلو الآخر (في هذا المثال، 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: 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 -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
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 -H "Authorization: Bearer ACCESS_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: 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/file1
  • https://SITE_ID.web.app/file2
  • https://SITE_ID.web.app/file3

يمكن أيضًا الوصول إلى هذه الملفات من خلال عناوين URL مرتبطة بنطاق SITE_ID.firebaseapp.com.

يمكنك أيضًا الاطّلاع على إصدارك الجديد في لوحة بيانات Hosting في وحدة تحكّم Firebase.