Chamar funções via solicitações HTTP


Use functions.https para acionar uma função com uma solicitação HTTP. Isso permite que você invoque uma função síncrona usando os 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 exemplo que é acionada ao enviar 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 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 boilerplate 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 usando o 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 ID 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

Se você encontrar erros de permissão durante a implantação, verifique se os papéis do IAM apropriados estão atribuídos ao usuário que executa os comandos de implantação.

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>

Se você invocar funções HTTP protegidas por um firewall ou filtro de IP, procure os endereços IP que o Google usa para transmitir essas funções.

Usar módulos de middleware com o Cloud Functions

Se você precisa inserir dependências de middleware para suporte a cookies ou CORS, 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.
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 "something"
req.rawBody O número bruto de bytes (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;

Encerrar 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}`);
functions.logger.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.