Wywoływanie funkcji za pomocą żądań HTTP (1 generacji)

Funkcję możesz wywołać za pomocą żądania HTTP, używając functions.https. Umożliwia to wywołanie funkcji synchronicznej za pomocą tych obsługiwanych metod HTTP: GET, POST, PUT, DELETE i OPTIONS.

Przykłady na tej stronie są oparte na a przykładowej funkcji , która jest wywoływana, gdy wysyłasz żądanie HTTP GET do punktu końcowego funkcji. Przykładowa funkcja pobiera bieżący czas serwera, formatuje go zgodnie z parametrem zapytania w adresie URL i wysyła wynik w odpowiedzi HTTP.

Wywoływanie funkcji za pomocą żądania HTTP

Użyj functions.https , aby utworzyć funkcję obsługującą zdarzenia HTTP. Moduł obsługi zdarzeń funkcji HTTP nasłuchuje zdarzenia onRequest(), które obsługuje routery i aplikacje zarządzane przez platformę internetową Express.

Używanie obiektów żądania i odpowiedzi Express

Obiekt Request, używany jako argumenty onRequest(), umożliwia dostęp do właściwości żądania HTTP wysłanego przez klienta, a obiekt Response umożliwia wysłanie odpowiedzi do klienta.

exports.date = functions.https.onRequest((req, res) => {
  // ...
});

Używanie istniejących aplikacji Express

Używając aplikacji jako argumentu dla onRequest(), możesz przekazać pełną aplikację Express do funkcji HTTP. Powtarzalny kod można przenieść do oprogramowania pośredniczącego, jak pokazano poniżej:

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);

Wywoływanie funkcji HTTP

Po wdrożeniu funkcji HTTP możesz ją wywołać za pomocą jej unikalnego adresu URL. Adres URL zawiera w tej kolejności:

  • Region (lub regiony), w którym wdrożono funkcję. Niektóre funkcje produkcyjne mogą wymagać wyraźnego ustawienia lokalizacji aby zminimalizować opóźnienie sieci.
  • Identyfikator projektu w Firebase
  • cloudfunctions.net
  • Nazwa funkcji

Na przykład adres URL do wywołania date() wygląda tak:

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

Jeśli podczas wdrażania funkcji wystąpią błędy uprawnień, upewnij się, że do użytkownika, który uruchamia polecenia wdrożenia, są przypisane odpowiednie role IAM.

W przypadku routingu aplikacji Express nazwa funkcji jest dodawana jako prefiks do ścieżek URL w zdefiniowanej aplikacji. Na przykład adres URL do wywołania gettera w przykładowej aplikacji Express powyżej wygląda tak:

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

Jeśli wywołujesz funkcje HTTP za zaporą sieciową lub filtrem IP, możesz sprawdzić adresy IP, których Google używa do obsługi funkcji HTTP.

Używanie modułów oprogramowania pośredniczącego w Cloud Functions

Jeśli musisz wstrzyknąć zależności oprogramowania pośredniczącego, np. na potrzeby obsługi plików cookie lub CORS, wywołaj je w funkcji. Aby na przykład włączyć obsługę CORS, dodaj ten blok:

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

Odczytywanie wartości z żądania

W tabeli poniżej znajdziesz kilka typowych scenariuszy:

Typ treści Treść żądania Zachowanie
application/json '{"name":"John"}' request.body.name jest równe „John”
application/octet-stream 'my text' request.body jest równe „6d792074657874” (surowe bajty żądania; zobacz dokumentację Node.js Buffer)
text/plain 'my text' request.body jest równe „my text”
application/x-www-form-urlencoded 'name=John' request.body.name jest równe „John”

Analizowanie jest wykonywane przez te analizatory treści:

Załóżmy, że funkcja jest wywoływana z tym żądaniem:

curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'

Wysłane dane zostaną zmaterializowane w:

Właściwość lub metoda Wartość
req.method "POST"
req.get('x-myheader') "123"
req.query.foo "baz"
req.body.text "something"
req.rawBody Surowe (nieprzeanalizowane) bajty żądania

W przykładzie funkcji date() funkcja sprawdza zarówno parametr adresu URL, jak i treść pod kątem wartości format, aby ustawić format daty i godziny:

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

Kończenie funkcji HTTP

Zawsze kończ funkcję HTTP za pomocą send(), redirect(), lub end(). W przeciwnym razie funkcja może nadal działać i zostać wymuszona przez system. Zobacz też Synchronizacja, asynchroniczność i obietnice.

Po pobraniu i sformatowaniu czasu serwera za pomocą modułu Node.js moment funkcja date() kończy się wysłaniem wyniku w odpowiedzi HTTP:

const formattedDate = moment().format(`${format}`);
functions.logger.log('Sending Formatted date:', formattedDate);
res.status(200).send(formattedDate);

Łączenie funkcji HTTP z Firebase Hosting

Funkcję HTTP możesz połączyć z Firebase Hosting. Żądania w witrynie Firebase Hosting mogą być przekierowywane do określonych funkcji HTTP. Umożliwia to też używanie własnej domeny niestandardowej z funkcją HTTP. Więcej informacji o łączeniu Cloud Functions z Firebase Hosting.