Chamar funções via solicitações HTTP

É possível acionar uma função por meio de uma solicitação HTTP usando functions.https. Isso permite que você invoque uma função síncrona por meio dos seguintes métodos HTTP compatíveis: GET, POST, PUT, DELETE e OPTIONS.

Os exemplos desta página foram criados com base em uma função de amostra (em inglês) que é acionada quando você envia uma solicitação HTTP GET para o ponto de extremidade das funções. A função de amostra recupera a hora atual do servidor, formata a hora conforme especificado em um parâmetro de consulta de URL e envia o resultado na resposta HTTP.

Acionar uma função com uma solicitação HTTP

Use functions.https para criar uma função que gerencie eventos HTTP. O manipulador de uma função HTTP detecta o evento onRequest(), que é compatível com roteadores e apps gerenciados pelo framework da Web Express (em inglês).

Como usar objetos de solicitação e resposta da Express

Usado na forma de argumentos de onRequest(), o objeto de solicitação (em inglês) concede acesso às propriedades da solicitação HTTP enviada pelo cliente, e o objeto de resposta (em inglês) permite retornar uma resposta a ele.

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

Como usar apps Express existentes

Ao usar o app (em inglês) como argumento de onRequest(), é possível transmitir um app Express completo para uma função HTTP. O código de texto clichê pode ser movido para o middleware como mostrado abaixo:

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);

Invocar uma função HTTP

Depois de implantar uma função HTTP, você pode invocá-la por meio do URL exclusivo dela. O URL inclui as informações abaixo na ordem mostrada:

  • A região (ou regiões) em que você implantou sua função Algumas funções de produção podem precisar definir explicitamente o local para minimizar a latência da rede
  • Seu código do projeto do Firebase
  • cloudfunctions.net
  • O nome da sua função

Por exemplo, o URL de invocação date() terá a seguinte aparência:

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

Com o roteamento de app do Express, o nome da função é adicionado como um prefixo aos caminhos do URL no aplicativo definido por você. Por exemplo, o URL para invocar o getter no exemplo do app Express acima fica assim:

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

Usar módulos de middleware com o Cloud Functions

Se você precisa inserir dependências de middleware para suporte a cookies ou acesso de origem cruzada (CORS, na sigla em inglês), chame os módulos a partir da função. Por exemplo, para ativar o suporte a CORS, adicione o seguinte bloco:

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

Ler os valores da solicitação

A tabela a seguir lista alguns cenários comuns:

Tipo de conteúdo Corpo da solicitação Comportamento
application/json '{"name":"John"}' request.body.name = 'John'
application/octet-stream 'my text' request.body é igual a "6d792074657874", o número bruto de bytes da solicitação. Consulte a documentação do buffer do Node.js (em inglês)
text/plain 'my text' request.body = 'my text'
application/x-www-form-urlencoded 'name=John' request.body.name = 'John'

Esta análise é feita pelos seguintes analisadores de corpo:

Suponha que sua função seja chamada com a seguinte solicitação:

curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'

então, os dados enviados seriam aplicados a:

Propriedade/Método Valor
req.method "POST"
req.get('x-myheader') "123"
req.query.foo "baz"
req.body.text "algo"
req.rawBody O número de bytes bruto (não analisados) do pedido

No exemplo de função date(), a função testa o parâmetro de URL e o corpo de um valor de format para definir o formato de data/hora a ser usado:

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

Terminar funções HTTP

Sempre encerre uma função HTTP com send(), redirect() ou end(). Caso contrário, ela pode continuar a ser executada e interrompida automaticamente pelo sistema. Veja também Sincronização, dessincronização e promessas.

A função date() será concluída depois que o horário do servidor for recuperado e formatado com o módulo moment (em inglês) do Node.js e quando o resultado na resposta HTTP for enviado.

const formattedDate = moment().format(format);
console.log('Sending Formatted date:', formattedDate);
res.status(200).send(formattedDate);

Como conectar funções HTTP ao Firebase Hosting

Você pode conectar uma função HTTP ao Firebase Hosting. As solicitações no seu site do Firebase Hosting podem ser encaminhadas para funções HTTP específicas. Isso também permite que você use seu próprio domínio personalizado com uma função HTTP. Saiba mais sobre Como conectar o Cloud Functions ao Firebase Hosting.