Chamar funções por meio de solicitações HTTP


Você pode acionar uma função por meio de uma solicitação HTTP usando functions.https . Isso permite invocar uma função síncrona por meio dos seguintes métodos HTTP suportados: GET , POST , PUT , DELETE e OPTIONS .

Os exemplos nesta página são baseados em uma função de amostra que é acionada quando você envia uma solicitação HTTP GET para o endpoint de 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.

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

Use functions.https para criar uma função que lide com eventos HTTP. O manipulador de eventos para uma função HTTP escuta o evento onRequest() , que oferece suporte a roteadores e aplicativos gerenciados pela estrutura da web Express .

Usando objetos de solicitação e resposta expressa

Usado como argumento para onRequest() , o objeto Request fornece acesso às propriedades da solicitação HTTP enviada pelo cliente, e o objeto Response fornece uma maneira de enviar uma resposta de volta ao cliente.

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

Usando aplicativos Express existentes

Usando App como argumento para onRequest() , você pode passar um aplicativo Express completo para uma função HTTP. O código padrão pode ser movido para o middleware conforme mostrado:

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 implementar uma função HTTP, você poderá invocá-la por meio de sua própria URL exclusiva. O URL inclui o seguinte, em ordem:

  • A região (ou regiões) na qual você implantou sua função. Algumas funções de produção podem precisar definir explicitamente o local para minimizar a latência da rede.
  • ID do seu projeto do Firebase
  • cloudfunctions.net
  • O nome da sua função

Por exemplo, a URL para invocar date() é assim:

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

Se você encontrar erros de permissão ao implantar funções, certifique-se de que as funções apropriadas do IAM estejam atribuídas ao usuário que executa os comandos de implantação.

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

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

Se você invocar funções HTTP por trás de um firewall ou filtro IP, poderá pesquisar os endereços IP que o Google usa para servir funções HTTP.

Use módulos de middleware com Cloud Functions

Se você precisar injetar dependências de middleware para coisas como suporte a cookies ou CORS, chame-as na função. Por exemplo, para ativar o suporte CORS, adicione o seguinte bloco:

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

Ler 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 é igual a 'John'
application/octet-stream 'meu texto' request.body é igual a '6d792074657874' (os bytes brutos da solicitação; consulte a documentação do Buffer Node.js )
text/plain 'meu texto' request.body é igual a 'meu texto'
application/x-www-form-urlencoded 'nome=João' request.body.name é igual a 'John'

Essa 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 materializados em:

Propriedade/Método Valor
req.method "PUBLICAR"
req.get('x-myheader') "123"
req.query.foo "baz"
req.body.text "algo"
req.rawBody Os bytes brutos (não analisados) da solicitação

No exemplo da função date() , a função testa o parâmetro URL e o corpo em busca de um valor 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 finalize uma função HTTP com send() , redirect() ou end() . Caso contrário, sua função poderá continuar em execução e ser encerrada à força pelo sistema. Veja também Sincronização, Assíncrono e Promessas .

Após recuperar e formatar a hora do servidor usando o módulo moment do Node.js, a função date() conclui enviando o resultado na resposta HTTP:

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

Conectando 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 proxy 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 .