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

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

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

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

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

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

אחרי אחזור ועיצוב של זמן השרת באמצעות Node.js מודול moment, הפונקציה 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