קריאה לפונקציות דרך בקשות HTTP


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

בדוגמה של הפונקציה date(), הפונקציה בודקת גם את הפרמטר של כתובת ה-URL וגם את הגוף כדי למצוא ערך 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