Chamar funções via solicitações HTTP

Você pode 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 são baseados em uma função de amostra que é acionada quando você envia uma solicitação HTTP GET para o endpoint 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 eventos para uma função HTTP detecta o evento onRequest(), que é compatível com roteadores e apps gerenciados pela biblioteca da Web Express.

Usar objetos de solicitação e resposta da biblioteca Express

Usado na forma de argumentos de onRequest(), o objeto de solicitação dá acesso às propriedades da solicitação HTTP enviada pelo cliente, e o objeto de resposta permite enviar uma resposta de volta ao cliente.

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

Como usar apps Express existentes

Ao usar o app como argumento de onRequest(), você pode transmitir um aplicativo 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

O corpo da solicitação é analisado automaticamente com base no cabeçalho content-type e disponibilizado por meio dos argumentos da sua função HTTP.

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 é igual a "John"
application/octet-stream "my text" request.body é igual a "6d792074657874", o número de bytes bruto da solicitação. Consulte a documentação do buffer do Node.js
text/plain "my text" request.body equivale a "my text"
application/x-www-form-urlencoded "name=John" request.body.name é igual a "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
request.method "POST"
request.get('x-myheader') "123"
request.query.foo "baz"
request.body.text "something"
request.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 termine 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.

Depois de recuperar e formatar o horário do servidor com o módulo moment do Node.js, a função date() é concluída quando envia o resultado na resposta HTTP:

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

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.

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.