קריאה לפונקציות דרך בקשות 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. אפשר להעביר קוד תבנית לתוכנה לעיבוד נתונים ביניים (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 'הטקסט שלי' request.body שווה ל'הטקסט שלי'
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 "something"
req.rawBody הבייטים הגולמיים (לא ניתחו) של הבקשה

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

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

סיום הפונקציות של HTTP

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

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

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

חיבור HTTP Functions אל Firebase Hosting

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