Puoi attivare una funzione tramite una richiesta HTTP utilizzando
functions.https
. In questo modo puoi chiamare 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 corrente del server, la formatta come specificato in un parametro di query dell'URL e invia il risultato nella risposta HTTP.
Attivare una funzione con una richiesta HTTP
Utilizza functions.https
per creare una funzione che gestisce gli eventi HTTP. Il gestore eventi per una funzione HTTP ascolta l'evento onRequest()
, che supporta router e app gestiti dal framework web Express.
Utilizzo degli oggetti di richiesta e risposta Express
Utilizzato come argomenti per onRequest()
,
l'oggetto Request consente di accedere alle proprietà della richiesta HTTP inviata dal client, mentre l'oggetto
Response consente di inviare una risposta al client.
exports.date = functions.https.onRequest((req, res) => { // ... });
Utilizzo di app Express esistenti
Utilizzando App come argomento per
onRequest()
, puoi
trasmettere un'app Express completa a una funzione HTTP. Il codice boilerplate può essere spostato nel middleware come mostrato di seguito:
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.
- Il tuo 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 di autorizzazione durante il deployment delle funzioni, assicurati che gli ruoli IAM appropriati siano assegnati all'utente che esegue i comandi di deployment.
Con il routing delle app Express, il nome della funzione viene aggiunto come prefisso ai percorsi URL nell'app che definisci. Ad esempio, l'URL per invocare il getter nell'esempio di app Express riportato sopra è il seguente:
https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>
Se richiami le funzioni HTTP dietro un firewall o un filtro IP, puoi cercare gli indirizzi IP utilizzati da Google per eseguire le funzioni HTTP.
Utilizzare i moduli middleware con Cloud Functions
Se devi iniettare dipendenze di middleware per elementi come il supporto dei cookie o CORS, chiamali all'interno della funzione. Ad esempio, per attivare il supporto CORS, aggiungi il seguente blocco:
// Enable CORS using the `cors` express middleware. cors(req, res, () => { // ... });
Leggere i valori dalla richiesta
La seguente tabella elenca 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 testo' | request.body è uguale a "6d792074657874" (i byte non elaborati della richiesta; consulta la documentazione di Buffer di Node.js) |
text/plain |
'il mio testo' | 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 analizzatori del corpo:
- Parser del corpo JSON
- Analizzatore del corpo non elaborato
- Parser del corpo del testo
- Parsatore del corpo del modulo codificato in URL
Supponiamo che la funzione venga chiamata con la seguente richiesta:
curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'
I dati inviati verranno quindi materializzati in:
Proprietà/Metodo | Valore |
---|---|
req.method |
"POST" |
req.get('x-myheader') |
"123" |
req.query.foo |
"baz" |
req.body.text |
"qualcosa" |
req.rawBody |
I byte non elaborati (non analizzati) della richiesta |
Nell'esempio della funzione date()
, la funzione verifica sia il parametro URL sia il corpo per un valore format
per impostare il formato data/ora da utilizzare:
let format = req.query.format; format = req.body.format;
Interrompere le funzioni HTTP
Termina sempre una funzione HTTP con send()
, redirect()
o end()
. In caso contrario, la funzione potrebbe continuare a funzionare e essere terminata forzatamente dal sistema. Vedi anche
Sincronizzazione, asincronia 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 di Funzioni HTTP a Firebase Hosting
Puoi collegare una funzione HTTP a Firebase Hosting. Le richieste sul tuo sito Firebase Hosting possono essere proxy per funzioni HTTP specifiche. In questo modo, puoi anche utilizzare il tuo dominio personalizzato con una funzione HTTP. Scopri di più su come collegare Cloud Functions a Firebase Hosting.