Puoi attivare una funzione tramite una richiesta HTTP utilizzando
functions.https
. Ciò ti consente di richiamare una funzione sincrona tramite
i seguenti metodi HTTP supportati: GET
, POST
, PUT
, DELETE
e
OPTIONS
.
Gli esempi in questa pagina si basano su una
funzione di esempio
che si attiva quando invii
una richiesta HTTP GET
all'endpoint delle funzioni. La funzione di esempio
recupera l'ora attuale del server, formatta l'ora come specificato in una query URL
e invia il risultato nella risposta HTTP.
Attivare una funzione con una richiesta HTTP
Utilizza functions.https
per creare una funzione che gestisca HTTP
eventi. Il gestore di eventi per una funzione HTTP rimane in ascolto dell'evento
onRequest()
,
che supporta router e app gestiti
il framework web Express.
Utilizzo di oggetti di richiesta e risposta Express
Utilizzati come argomenti per onRequest()
,
l'oggetto Request restituisce
si accede alle proprietà della richiesta HTTP inviata dal client e
L'oggetto Response consente di
manda una risposta al cliente.
exports.date = functions.https.onRequest((req, res) => { // ... });
Usare le app Express esistenti
Utilizzare App come argomento per
onRequest()
, puoi
passare un'app Express completa a una funzione HTTP. Il codice boilerplate può essere spostato
al middleware, come mostrato:
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);
Richiamare una funzione HTTP
Dopo aver eseguito il deployment di una funzione HTTP, puoi richiamarla tramite il relativo URL univoco. L'URL include quanto segue, in ordine:
- La regione (o le regioni) in cui hai eseguito il deployment della funzione. Per alcune funzioni di produzione potrebbe essere necessario impostare esplicitamente la posizione per ridurre al minimo la latenza della rete.
- L'ID progetto Firebase
cloudfunctions.net
- Il nome della funzione
Ad esempio, l'URL per richiamare date()
è il seguente:
https://us-central1-<project-id>.cloudfunctions.net/date
Se si verificano errori relativi alle autorizzazioni durante il deployment delle funzioni, assicurati che: i ruoli IAM appropriati sono e assegnato all'utente che esegue i comandi di deployment.
Con il routing dell'app Express, il nome della funzione viene aggiunto come prefisso ai percorsi dell'URL nell'app da te definita. Ad esempio, l'URL per richiamare il getter nell'espressione l'esempio di app riportato sopra ha il seguente aspetto:
https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>
Se richiami funzioni HTTP dietro un firewall o un filtro IP, puoi cercare gli indirizzi IP utilizzati da Google per eseguire le funzioni HTTP.
Usa i moduli middleware con Cloud Functions
Se devi inserire dipendenze middleware per aspetti come il supporto dei cookie o CORS, richiamali all'interno della funzione. Ad esempio, per abilitare il supporto CORS, aggiungi il seguente blocco:
// Enable CORS using the `cors` express middleware. cors(req, res, () => { // ... });
Leggi i valori dalla richiesta
Nella tabella seguente sono elencati alcuni scenari comuni:Tipo di contenuti | Corpo della richiesta | Comportamento |
---|---|---|
application/json |
'{"name":"John"}' |
request.body.name è uguale a "Mario" |
application/octet-stream |
"il mio messaggio" | request.body equivale a "6d792074657874" (i byte non elaborati della richiesta; consulta la documentazione relativa al buffer Node.js) |
text/plain |
"il mio messaggio" | request.body è uguale a "il mio testo" |
application/x-www-form-urlencoded |
'name=John' | request.body.name è uguale a "Mario" |
Questa analisi viene eseguita dai seguenti parser del corpo:
- Parser del corpo JSON
- Analizzatore di dati non elaborati del corpo
- Analizzatore del corpo del testo
- Analizzatore del corpo del modulo con codifica URL
Supponiamo che la tua funzione venga chiamata con la richiesta seguente:
curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'
i dati inviati vengono materializzati in:
Proprietà/Metodo | Valore |
---|---|
req.method |
"PUBBLICA" |
req.get('x-myheader') |
"123" |
req.query.foo |
"baz" |
req.body.text |
"qualcosa" |
req.rawBody |
Byte non elaborati (non analizzati) della richiesta |
Nell'esempio della funzione date()
, la funzione verifica sia il parametro URL che
Il corpo di un valore format
per impostare il formato di data/ora da utilizzare:
let format = req.query.format; format = req.body.format;
Termina funzioni HTTP
Termina sempre una funzione HTTP con send()
, redirect()
o end()
. In caso contrario, la funzione potrebbe continuare a essere eseguita
arrestato in modo forzato dal sistema. Vedi anche
Sincronizzazione, Asinc e Promesse.
Dopo aver recuperato e formattato l'ora del server utilizzando il modulo Node.js
moment
, la funzione date()
conclude inviando il risultato nella risposta HTTP:
const formattedDate = moment().format(`${format}`); functions.logger.log('Sending Formatted date:', formattedDate); res.status(200).send(formattedDate);
Connessione delle funzioni HTTP a Firebase Hosting
Puoi collegare una funzione HTTP a Firebase Hosting. Richieste su Il sito Firebase Hosting può essere inviato tramite proxy a funzioni HTTP specifiche. Anche questo consente di utilizzare il proprio dominio personalizzato con una funzione HTTP. Scopri di più su connessione di Cloud Functions a Firebase Hosting.