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


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

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

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

השתמש functions.https כדי ליצור פונקציה המטפלת באירועי HTTP. המטפל באירועים עבור פונקציית HTTP מאזין לאירוע onRequest() התומך בנתבים ואפליקציות המנוהלים על ידי מסגרת האינטרנט של Express .

שימוש באובייקטי בקשה ותגובה אקספרס

בשימוש כארגומנטים עבור onRequest() , האובייקט Request נותן לך גישה למאפיינים של בקשת ה-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, תוכל להפעיל אותה דרך כתובת האתר הייחודית שלה. כתובת האתר כוללת את הדברים הבאים, לפי הסדר:

  • האזור (או האזורים) שאליו פרסת את הפונקציה שלך. ייתכן שחלק מפונקציות הייצור יצטרכו להגדיר במפורש את המיקום כדי למזער את זמן האחזור של הרשת.
  • מזהה הפרויקט שלך ב-Firebase
  • cloudfunctions.net
  • שם הפונקציה שלך

לדוגמה, כתובת האתר להפעלת date() נראית כך:

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

אם אתה נתקל בשגיאות הרשאות בעת פריסת פונקציות, ודא שתפקידי IAM המתאימים מוקצים למשתמש המריץ את פקודות הפריסה.

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

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

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

השתמש במודולי תווך עם פונקציות ענן

אם אתה צריך להחדיר תלות בתוכנת התווך עבור דברים כמו תמיכה בקובצי Cookie או CORS, התקשר אליהם בתוך הפונקציה. לדוגמה, כדי לאפשר תמיכת CORS, הוסף את הבלוק הבא:

// Enable CORS using the `cors` express middleware.
cors(req, res, () => {
  // ...
});

קרא ערכים מהבקשה

הטבלה הבאה מפרטת כמה תרחישים נפוצים:

סוג תוכן גוף הבקשה התנהגות
application/json '{"name":"John"}' request.body.name שווה ל-'John'
application/octet-stream 'הטקסט שלי' request.body שווה '6d792074657874' (הבתים הגולמיים של הבקשה; ראה תיעוד של Node.js Buffer )
text/plain 'הטקסט שלי' request.body שווה 'הטקסט שלי'
application/x-www-form-urlencoded 'שם=ג'ון' 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 "הודעה"
req.get('x-myheader') "123"
req.query.foo "באז"
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

אתה יכול לחבר פונקציית HTTP ל-Firebase Hosting. ניתן לשלוח בקשות באתר האירוח שלך ב-Firebase לפונקציות HTTP ספציפיות. זה גם מאפשר לך להשתמש בדומיין מותאם אישית משלך עם פונקציית HTTP. למידע נוסף על חיבור פונקציות ענן לאירוח של Firebase .