Wywołaj funkcje za pośrednictwem żądań HTTP

Funkcję można wyzwolić za pomocą żądania HTTP, korzystając z functions.https . Umożliwia to wywoływanie funkcji synchronicznej za pomocą następujących obsługiwanych metod HTTP: GET , POST , PUT , DELETE i OPTIONS .

Przykłady na tej stronie są oparte na przykładowej funkcji , która jest wyzwalana po wysłaniu żądania HTTP GET do punktu końcowego funkcji. Przykładowa funkcja pobiera bieżący czas serwera, formatuje czas zgodnie z parametrem zapytania adresu URL i wysyła wynik w odpowiedzi HTTP.

Uruchom funkcję z żądaniem HTTP

Użyj functions.https aby utworzyć funkcję, która obsługuje zdarzenia HTTP. Program obsługi zdarzeń dla funkcji HTTP nasłuchuje zdarzenia onRequest() , które obsługuje routery i aplikacje zarządzane przez strukturę sieci Web Express .

Korzystanie z ekspresowych obiektów żądań i odpowiedzi

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

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

Korzystanie z istniejących aplikacji Express

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

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łaj funkcję HTTP

Po wdrożeniu funkcji HTTP można ją wywołać za pomocą jej własnego unikalnego adresu URL. Adres URL zawiera następujące elementy, w kolejności:

  • Region (lub regiony), w którym wdrożono funkcję. Niektóre funkcje produkcyjne mogą wymagać jawnego ustawienia lokalizacji w celu zminimalizowania opóźnień w sieci.
  • Twój identyfikator projektu Firebase
  • cloudfunctions.net
  • Nazwa Twojej 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 odpowiednie role uprawnień są przypisane do użytkownika uruchamiającego polecenia wdrażania.

W przypadku ekspresowego routingu aplikacji nazwa funkcji jest dodawana jako prefiks do ścieżek URL w zdefiniowanej aplikacji. Na przykład adres URL do wywołania metody pobierającej w powyższym przykładzie aplikacji Express 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 wyszukać adresy IP, których Google używa do obsługi funkcji HTTP.

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

Jeśli musisz wstrzyknąć zależności oprogramowania pośredniczącego dla takich rzeczy, jak obsługa plików cookie lub CORS, wywołaj je w funkcji. Na przykład, aby włączyć obsługę CORS, dodaj następujący blok:

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

Odczytaj wartości z żądania

W poniższej tabeli wymieniono niektóre typowe scenariusze:

Typ zawartości Treść zapytania Zachowanie
application/json '{"name":"John"}' request.body.name równa się „Jan”
application/octet-stream „mój tekst” request.body równa się '6d792074657874' (surowe bajty żądania; zobacz dokumentację Node.js Buffer )
text/plain „mój tekst” request.body równa się „mój tekst”
application/x-www-form-urlencoded 'imię=Jan' request.body.name równa się „Jan”

To parsowanie jest wykonywane przez następujące parsery treści:

Załóżmy, że twoja funkcja jest wywoływana z następującym żądaniem:

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

wówczas przesłane dane zostaną zmaterializowane pod:

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

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

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

Zakończ funkcje HTTP

Zawsze kończ funkcję HTTP za pomocą send() , redirect() lub end() . W przeciwnym razie funkcja może nadal działać i zostać wymuszone przez system. Zobacz też Synchronizacja, Async 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 Hostingiem Firebase

Możesz połączyć funkcję HTTP z Hostingiem Firebase. Żądania w Twojej witrynie w Hostingu Firebase mogą być przesyłane przez serwer proxy do określonych funkcji HTTP. Pozwala to również na użycie własnej domeny niestandardowej z funkcją HTTP. Dowiedz się więcej o łączeniu Cloud Functions z Hostingiem Firebase .