אפשר להפעיל פונקציה באמצעות בקשת 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