Możesz aktywować funkcję za pomocą żądania HTTP, używając functions.https. Dzięki temu możesz wywołać funkcję synchroniczną za pomocą tych obsługiwanych metod HTTP: GET, POST, PUT, DELETE i OPTIONS.
Przykłady na tej stronie są oparte na przykładowej funkcji, która jest aktywowana, 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 adresu URL i wysyła wynik w odpowiedzi HTTP.
Aktywowanie 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 argument funkcji onRequest() daje 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) => { // ... });
Korzystanie z istniejących aplikacji Express
Używając App 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 te elementy (w podanej kolejności):
- Region (lub regiony), w którym wdrożono funkcję. Niektóre funkcje produkcyjne mogą wymagać wyraźnego ustawienia lokalizacji, aby zminimalizować opóźnienia sieci.
- Identyfikator projektu w Firebase
cloudfunctions.net- nazwę 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 użytkownikowi, który uruchamia polecenia wdrażania, przypisano odpowiednie role uprawnień.
W przypadku routingu aplikacji Express nazwa funkcji jest dodawana jako prefiks do ścieżek adresów 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 adresów IP, możesz wyszukać adresy IP, których Google używa do obsługi funkcji HTTP.
Używanie modułów oprogramowania pośredniczącego z Cloud Functions
Jeśli musisz wstrzyknąć zależności oprogramowania pośredniczącego, np. obsługę 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 sytuacji:| Typ treści | Treść żądania | Zachowanie |
|---|---|---|
application/json |
'{"name":"John"}' |
request.body.name to „Jan” |
application/octet-stream |
'my text' | request.body jest równe „6d792074657874” (nieprzetworzone bajty żądania; patrz dokumentacja bufora Node.js). |
text/plain |
'my text' | request.body równa się „mój tekst” |
application/x-www-form-urlencoded |
'name=John' | request.body.name to „Jan” |
Analiza jest wykonywana przez te parsery treści:
- Parser treści JSON
- Parser nieprzetworzonej treści
- Parser treści tekstowej
- Parser treści formularza zakodowanego w formacie adresu URL
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"}'
to wysłane dane zostaną zmaterializowane w:
| Właściwość/metoda | Wartość |
|---|---|
req.method |
"POST" |
req.get('x-myheader') |
„123” |
req.query.foo |
"baz" |
req.body.text |
„coś” |
req.rawBody |
Nieprzetworzone 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;
Zakoń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ć wymuszenie zakończona przez system. Zobacz też Sync, Async and Promises (Synchronizacja, asynchronizacja i obietnice).
Po pobraniu i sformatowaniu czasu serwera za pomocą modułu Node.js moment funkcja date() kończy działanie, wysyłając wynik 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 usługą Firebase Hosting. Żądania w witrynie Firebase Hosting mogą być przekazywane do określonych funkcji HTTP. Umożliwia to też używanie własnej domeny z funkcją HTTP. Dowiedz się więcej o łączeniu Cloud Functions z Firebase Hosting.