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

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

הדוגמאות בדף הזה מבוססות על פונקציה לדוגמה שמופעלת כששולחים בקשת GET מסוג HTTP לנקודת הקצה (endpoint) של הפונקציות. הפונקציה לדוגמה מאחזרת את השעה הנוכחית בשרת, מעצבת את השעה כפי שצוין בפרמטר של שאילתת כתובת ה-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. אפשר להעביר את הקוד שחוזר על עצמו ל-middleware, כמו בדוגמה הבאה:

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 המתאימים הוקצו למשתמש שמריץ את פקודות הפריסה.

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

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

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

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

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

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

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

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

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

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

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

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 דרך שרת proxy לפונקציות HTTP ספציפיות. כך גם תוכלו להשתמש בדומיין מותאם אישית משלכם עם פונקציית HTTP. מידע נוסף על קישור Cloud Functions אל Firebase Hosting