È possibile attivare una funzione tramite una richiesta HTTP utilizzando functions.https
. Ciò 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 corrente del server, formatta l'ora come specificato in un parametro di query URL e invia il risultato nella risposta HTTP.
Attiva una funzione con una richiesta HTTP
Utilizza functions.https
per creare una funzione che gestisca 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 di oggetti di richiesta e risposta Express
Utilizzato come argomenti per onRequest()
, l'oggetto Request ti dà accesso alle proprietà della richiesta HTTP inviata dal client e l'oggetto Response ti dà un modo per inviare una risposta al client.
exports.date = functions.https.onRequest((req, res) => { // ... });
Utilizzando le app Express esistenti
Utilizzando App come argomento per onRequest()
, puoi passare un'app Express completa a una funzione HTTP. Il codice boilerplate può essere spostato nel 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);
Richiama una funzione HTTP
Dopo aver distribuito una funzione HTTP, puoi richiamarla tramite il suo URL univoco. L'URL include quanto segue, in ordine:
- La regione (o le regioni) in cui hai distribuito la tua funzione. Per alcune funzioni di produzione potrebbe essere necessario impostare esplicitamente la posizione per ridurre al minimo la latenza di rete.
- Il tuo ID progetto Firebase
-
cloudfunctions.net
- Il nome della tua funzione
Ad esempio, l'URL per richiamare date()
è simile al seguente:
https://us-central1-<project-id>.cloudfunctions.net/date
Se riscontri errori di autorizzazione durante la distribuzione delle funzioni, assicurati che i ruoli IAM appropriati siano assegnati all'utente che esegue i comandi di distribuzione.
Con il routing delle app Express, il nome della funzione viene aggiunto come prefisso ai percorsi URL nell'app definita. Ad esempio, l'URL per richiamare il getter nell'esempio dell'app Express sopra è simile al 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 che Google utilizza per fornire le funzioni HTTP.
Utilizza i moduli middleware con Cloud Functions
Se è necessario inserire dipendenze middleware per cose come il supporto dei cookie o CORS, chiamarle 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, () => { // ... });
Leggere i valori dalla richiesta
La tabella seguente elenca alcuni scenari comuni:Tipo di contenuto | Richiedi corpo | Comportamento |
---|---|---|
application/json | '{"name":"John"}' | request.body.name è uguale a "John" |
application/octet-stream | "il mio messaggio" | request.body è uguale a '6d792074657874' (i byte grezzi della richiesta; vedere la documentazione del buffer Node.js ) |
text/plain | "il mio messaggio" | request.body è uguale a "il mio testo" |
application/x-www-form-urlencoded | 'nome=Giovanni' | request.body.name è uguale a "John" |
Questa analisi viene eseguita dai seguenti parser del corpo:
- Analizzatore del corpo JSON
- Analizzatore di corpo grezzo
- Analizzatore del corpo del testo
- Parser del corpo del modulo con codifica URL
Supponiamo che la tua 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"}'
quindi i dati inviati verrebbero materializzati sotto:
Proprietà/Metodo | Valore |
---|---|
req.method | "INVIARE" |
req.get('x-myheader') | "123" |
req.query.foo | "baz" |
req.body.text | "qualcosa" |
req.rawBody | I byte grezzi (non analizzati) della richiesta |
Nell'esempio della funzione date()
, la funzione verifica sia il parametro URL che il corpo per un valore format
per impostare il formato data/ora da utilizzare:
let format = req.query.format; format = req.body.format;
Termina le funzioni HTTP
Termina sempre una funzione HTTP con send()
, redirect()
o end()
. In caso contrario, la funzione potrebbe continuare a essere eseguita ed essere terminata forzatamente dal sistema. Vedi anche Sincronizzazione, Asincrono e Promesse .
Dopo aver recuperato e formattato l'orario del server utilizzando il modulo moment
di Node.js, 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 all'hosting Firebase
Puoi connettere una funzione HTTP a Firebase Hosting. Le richieste sul tuo sito di hosting Firebase possono essere inoltrate a specifiche funzioni HTTP. Ciò ti consente anche di utilizzare il tuo dominio personalizzato con una funzione HTTP. Scopri di più sulla connessione di Cloud Functions a Firebase Hosting .