הפעלת פונקציות באמצעות בקשות HTTP (דור ראשון)

אפשר להפעיל פונקציה באמצעות בקשת HTTP באמצעות functions.https. כך תוכלו להפעיל פונקציה סינכרונית באמצעות שיטות ה-HTTP הנתמכות הבאות: GET,‏ POST,‏ PUT,‏ DELETE ו-OPTIONS.

הדוגמאות בדף הזה מבוססות על פונקציה לדוגמה שמופעלת כששולחים בקשת HTTP GET לנקודת הקצה של הפונקציות. פונקציית הדוגמה מאחזרת את השעה הנוכחית בשרת, מעצבת את השעה כפי שמצוין בפרמטר של שאילתת URL ושולחת את התוצאה בתגובת ה-HTTP.

הפעלת פונקציה באמצעות בקשת HTTP

משתמשים ב-functions.https כדי ליצור פונקציה שמטפלת באירועי HTTP. גורם מטפל באירועים של פונקציית HTTP מקשיב לאירוע onRequest(), שתומך בנתבים ובאפליקציות שמנוהלים על ידי מסגרת האינטרנט Express.

שימוש באובייקטים של בקשות ותשובות ב-Express

האובייקט Request, שמשמש כארגומנט עבור onRequest(), מאפשר לכם לגשת למאפיינים של בקשת ה-HTTP שנשלחה על ידי הלקוח. האובייקט Response מאפשר לכם לשלוח תשובה בחזרה ללקוח.

exports.date = functions.https.onRequest((req, res) => {
  // ...
});

שימוש באפליקציות Express קיימות

אם משתמשים ב-App כארגומנט של onRequest(), אפשר להעביר אפליקציית Express מלאה לפונקציית HTTP. אפשר להעביר קוד Boilerplate לתוכנת ביניים, כמו שמוצג כאן:

const express = require('express');
const cors = require('cors');

const app = express();

// Automatically allow cross-origin requests
app.use(cors({ origin: true }));

// Add middleware to authenticate requests
app.use(myMiddleware);

// build multiple CRUD interfaces:
app.get('/:id', (req, res) => res.send(Widgets.getById(req.params.id)));
app.post('/', (req, res) => res.send(Widgets.create()));
app.put('/:id', (req, res) => res.send(Widgets.update(req.params.id, req.body)));
app.delete('/:id', (req, res) => res.send(Widgets.delete(req.params.id)));
app.get('/', (req, res) => res.send(Widgets.list()));

// Expose Express API as a single Cloud Function:
exports.widgets = functions.https.onRequest(app);

הפעלת פונקציית HTTP

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

  • האזור (או האזורים) שבו פרסתם את הפונקציה. יכול להיות שחלק מהפונקציות של הייצור יצטרכו להגדיר במפורש את המיקום כדי לצמצם את זמן האחזור ברשת.
  • מזהה הפרויקט ב-Firebase
  • cloudfunctions.net
  • שם הפונקציה

לדוגמה, כתובת ה-URL להפעלת date() נראית כך:

https://us-central1-<project-id>.cloudfunctions.net/date

אם נתקלתם בשגיאות הרשאה כשפרסתם פונקציות, ודאו שתפקידי ה-IAM המתאימים הוקצו למשתמש שמריץ את פקודות הפריסה.

בניתוב מהיר של אפליקציות, שם הפונקציה מתווסף כקידומת לנתיבי כתובות ה-URL באפליקציה שאתם מגדירים. לדוגמה, כתובת ה-URL להפעלת הפונקציה getter בדוגמה של אפליקציית Express שלמעלה נראית כך:

https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>

אם אתם מפעילים פונקציות HTTP מאחורי חומת אש או מסנן IP, אתם יכולים לחפש את כתובות ה-IP שבהן Google משתמשת כדי להציג פונקציות HTTP.

שימוש במודולים של תוכנת ביניים עם Cloud Functions

אם אתם צריכים להוסיף תלות בתוכנת ביניים (middleware) כדי לתמוך בדברים כמו קובצי Cookie או CORS, אתם יכולים לקרוא לפונקציות האלה בתוך הפונקציה. לדוגמה, כדי להפעיל תמיכה ב-CORS, מוסיפים את הבלוק הבא:

// Enable CORS using the `cors` express middleware.
cors(req, res, () => {
  // ...
});

קריאת ערכים מהבקשה

בטבלה הבאה מפורטים כמה תרחישים נפוצים:

סוג תוכן גוף הבקשה התנהגות
application/json '{"name":"John"}' ‫request.body.name שווה ל-John
application/octet-stream 'my text' ‫request.body שווה ל-'6d792074657874' (הבייטים הגולמיים של הבקשה; ראו מסמכי התיעוד של Node.js Buffer)
text/plain 'my text' ‫request.body שווה ל-'my text'
application/x-www-form-urlencoded 'name=John' ‫request.body.name שווה ל-John

הניתוח הזה מתבצע על ידי מנתחי הגוף הבאים:

נניח שהפונקציה נקראת עם הבקשה הבאה:

curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'

אז הנתונים שנשלחו יתממשו בנתיב:

מאפיין/שיטה ערך
req.method ‎"POST"‎
req.get('x-myheader') ‪"123"
req.query.foo ‪"baz"
req.body.text "משהו"
req.rawBody הבייטים הגולמיים (לא מנותחים) של הבקשה

בדוגמה של הפונקציה date(), הפונקציה בודקת גם את הפרמטר של כתובת ה-URL וגם את גוף הבקשה כדי למצוא ערך format ולהגדיר את פורמט התאריך והשעה לשימוש:

let format = req.query.format;
format = req.body.format;

הפסקת פונקציות HTTP

תמיד מסיימים פונקציית HTTP עם send(), redirect() או end(). אחרת, יכול להיות שהפונקציה תמשיך לפעול והמערכת תפסיק אותה בכוח. אפשר לעיין גם במאמר Sync, Async and Promises (סנכרון, אסינכרון והבטחות).

אחרי אחזור ועיצוב של זמן השרת באמצעות המודול moment של Node.js, הפונקציה date() מסיימת את הפעולה בשליחת התוצאה בתגובת ה-HTTP:

const formattedDate = moment().format(`${format}`);
functions.logger.log('Sending Formatted date:', formattedDate);
res.status(200).send(formattedDate);

חיבור פונקציות HTTP אל Firebase Hosting

אפשר לקשר פונקציית HTTP אל Firebase Hosting. אפשר להעביר בקשות באתר Firebase Hosting באמצעות פרוקסי לפונקציות HTTP ספציפיות. בנוסף, תוכלו להשתמש בדומיין מותאם אישית משלכם עם פונקציית HTTP. מידע נוסף על קישור Cloud Functions אל Firebase Hosting