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

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

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

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