Confira tudo que foi anunciado no Firebase Summit e veja como usar o Firebase para acelerar o desenvolvimento de apps e executar os aplicativos com confiança. Saiba mais

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

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

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 terminal 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.

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

Use functions.https para criar uma função que manipule 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 Express

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 clichê pode ser movido para o middleware como 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 implantar uma função HTTP, você pode invocá-la por meio de seu próprio URL exclusivo. A 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.
  • Seu código do projeto Firebase
  • cloudfunctions.net
  • O nome da sua função

Por exemplo, a URL para invocar date() tem esta aparência:

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 sejam atribuídas ao usuário que está executando 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ê definir. Por exemplo, a URL para invocar o getter no exemplo de aplicativo Express acima se parece com isto:

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

Se você invocar funções HTTP por trás de um firewall ou filtro de IP, poderá pesquisar os endereços IP que o Google usa para atender às 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 dentro da função. Por exemplo, para habilitar o suporte a 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 Node.js Buffer )
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 sob:

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 de URL e o corpo para 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 finalize uma função HTTP com send() , redirect() ou end() . Caso contrário, sua função pode continuar em execução e ser encerrada à força pelo sistema. Consulte também Sincronização, Assíncrona e Promessas .

Depois de recuperar e formatar a hora do servidor usando o módulo Node.js moment , 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 em seu site do Firebase Hosting podem ter 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 .