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


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

הדוגמאות בדף הזה מבוססות על פונקציה לדוגמה שמופעלת כששולחים בקשת HTTP GET לנקודת הקצה של הפונקציה. פונקציית הדוגמה מאחזרת את השעה הנוכחית בשרת, מעצבת את השעה כפי שמצוין בפרמטר של שאילתת URL ושולחת את התוצאה בתגובת ה-HTTP.

הפעלת פונקציה באמצעות בקשת HTTP

משתמשים ב-functions.https כדי ליצור פונקציה שמטפלת באירועי HTTP. ה-event handler של פונקציית 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 המתאימים הוקצו למשתמש שמריץ את פקודות הפריסה.

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

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

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

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

אם אתם צריכים להוסיף תלות בתוכנת ביניים (middleware) כדי לתמוך בדברים כמו קובצי 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 equals '6d792074657874' (the raw bytes of the request; see the Node.js Buffer documentation)
text/plain 'my text' 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 "משהו"
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 ספציפיות. בנוסף, תוכלו להשתמש בדומיין מותאם אישית משלכם עם פונקציית HTTP. מידע נוסף על קישור Cloud Functions אל Firebase Hosting