אפשר להפעיל פונקציה באמצעות בקשת 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 שווה ל'ישראל' |
הניתוח הזה מתבצע על ידי מנתח הגוף הבא:
- כלי לניתוח גוף JSON
- כלי לניתוח גוף גולמי
- מנתח גוף הטקסט
- כלי לניתוח גוף הטופס בקידודי תווים שמתאימים לכתובות URL
נניח שנקראה הפונקציה עם הבקשה הבאה:
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