Funzioni di chiamata tramite richieste HTTP

È possibile attivare una funzione tramite una richiesta HTTP utilizzando functions.https . Ciò consente di richiamare una funzione sincrona attraverso i seguenti metodi supportati HTTP: GET , POST , PUT , DELETE , e OPTIONS .

Gli esempi in questa pagina si basano su un funzione di esempio che si attiva quando si invia un HTTP GET richiesta al funzioni endpoint. 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

Utilizzare functions.https per creare una funzione che gestisce HTTP eventi. Il gestore di eventi per un ascolti funzione HTTP per onRequest() evento, che supporta i router e applicazioni gestito dalla espresso framework web.

Utilizzo di oggetti di richiesta e risposta Express

Usato come argomenti per onRequest() , la richiesta oggetto che consente di accedere alle proprietà della richiesta HTTP inviato dal client, e la risposta oggetto ti dà un modo per inviare un back risposta al client.

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

Utilizzo di app Express esistenti

Utilizzando App come argomento per onRequest() , è possibile passare un espresso un'applicazione 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);

Invocare una funzione HTTP

Dopo aver distribuito una funzione HTTP, puoi invocarla tramite il suo URL univoco. L'URL include quanto segue, nell'ordine:

  • La regione (o le regioni) in cui hai distribuito la tua funzione. 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() assomiglia a questo:

https://us-central1-<project-id>.cloudfunctions.net/date

Se si verificano errori di autorizzazioni durante la distribuzione di funzioni, assicurarsi che le appropriate ruoli IAM vengono assegnati per l'utente che esegue i comandi di distribuzione.

Con il routing dell'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 ha il seguente aspetto:

https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>

Se si richiama HTTP funzioni dietro un firewall o un filtro IP, è possibile cercare gli indirizzi IP che Google utilizza per servire HTTP funzioni.

Utilizza moduli middleware con Cloud Functions

Se hai bisogno di iniettare dipendenze middleware per cose come il supporto dei cookie o CORS, chiamale all'interno della funzione. Ad esempio, per abilitare il supporto CORS, aggiungi il seguente blocco:

// Enable CORS using the `cors` express middleware.
return cors(req, res, () => {
  // ...
});

Leggi 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 testo' request.body è uguale a '6d792074657874' (i byte prime della richiesta; consultare la documentazione di Node.js Buffer )
text/plain 'il mio testo' request.body eguali '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:

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 si materializzerebbero sotto:

Proprietà/Metodo Valore
req.method "INVIARE"
req.get('x-myheader') "123"
req.query.foo "bacio"
req.body.text "qualcosa"
req.rawBody I byte grezzi (non analizzati) della richiesta

Nella date() esempio la funzione, la funzione controlla sia il parametro URL e il corpo per un format valore per impostare il formato data / ora per uso:

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

Termina le funzioni HTTP

Terminare sempre una funzione HTTP con send() , redirect() o end() . In caso contrario, la tua funzione potrebbe continuare a essere eseguita ed essere interrotta forzatamente dal sistema. Vedi anche Sync, asincrono e promesse .

Dopo aver recuperato e la formattazione l'ora del server utilizzando il Node.js moment del modulo, la date() la funzione si conclude con l'invio il risultato nella risposta HTTP:

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

Collegamento delle funzioni HTTP all'hosting Firebase

Puoi connettere una funzione HTTP a Firebase Hosting. Le richieste sul tuo sito Firebase Hosting possono essere inoltrate tramite proxy a specifiche funzioni HTTP. Ciò ti consente anche di utilizzare il tuo dominio personalizzato con una funzione HTTP. Scopri di più su collegamento funzioni cloud di Firebase Hosting .