Chiamare funzioni tramite richieste HTTP (1ª gen.)

Puoi attivare una funzione tramite una richiesta HTTP utilizzando functions.https. In questo modo, puoi 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 viene attivata 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 di eventi per una funzione HTTP è in attesa dell' onRequest() evento, che supporta router e app gestiti da l framework web Express.

Utilizzare gli oggetti richiesta e risposta di Express

Utilizzato come argomento per onRequest(), l'oggetto Request ti consente di accedere alle proprietà della richiesta HTTP inviata dal client, mentre l'oggetto Response ti consente di inviare una risposta al client.

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

Utilizzare 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 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 suo URL univoco. L'URL include i seguenti elementi, nell'ordine:

  • La regione (o le regioni) in cui hai eseguito il deployment della funzione. Alcune funzioni di produzione potrebbero dover impostare esplicitamente la località per ridurre al minimo la latenza di 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 riscontri errori di autorizzazione durante il deployment delle funzioni, assicurati che all'utente che esegue i comandi di deployment siano assegnati i ruoli IAM appropriati.

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 richiamare 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 pubblicare le funzioni HTTP.

Utilizzare i moduli middleware con Cloud Functions

Se devi inserire dipendenze 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 "John"
application/octet-stream "my text" request.body è uguale a "6d792074657874" (i byte non elaborati della richiesta; consulta la documentazione di Node.js Buffer)
text/plain "my text" request.body è uguale a "my text"
application/x-www-form-urlencoded "name=John" request.body.name è uguale a "John"

L'analisi viene eseguita dai seguenti parser del corpo:

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"}'

I dati inviati verranno materializzati in:

Proprietà/Metodo Valore
req.method "POST"
req.get('x-myheader') "123"
req.query.foo "baz"
req.body.text "something"
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 di data/ora da utilizzare:

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

Terminare le funzioni HTTP

Termina sempre una funzione HTTP con send(), redirect(), o end(). In caso contrario, la funzione potrebbe continuare a essere eseguita e terminare forzatamente dal sistema. Consulta anche Sincrono, asincrono e promesse.

Dopo aver recuperato e formattato l'ora del server utilizzando il modulo moment di Node.js, la funzionedate() termina inviando il risultato nella risposta HTTP:

const formattedDate = moment().format(`${format}`);
functions.logger.log('Sending Formatted date:', formattedDate);
res.status(200).send(formattedDate);

Connettere le funzioni HTTP a Firebase Hosting

Puoi connettere una funzione HTTP a Firebase Hosting. Le richieste sul tuo Firebase Hosting sito possono essere inviate tramite proxy a funzioni HTTP specifiche. In questo modo, puoi anche utilizzare il tuo dominio personalizzato con una funzione HTTP. Scopri di più su come connettere Cloud Functions a Firebase Hosting.