Chamar funções via solicitações HTTP

Como na 1ª geração, é possível acionar uma função com uma solicitação HTTP usando o manipulador onRequest(). Isso permite que você invoque uma função usando os seguintes métodos HTTP compatíveis: GET, POST, PUT, DELETE e OPTIONS.

Outras opções de HTTP

Opção Descrição
region As funções HTTP podem especificar uma matriz de regiões, bem como uma única região. Quando várias regiões são especificadas, uma instância de função separada é implantada em cada região.
timeoutSeconds As funções HTTP podem especificar um tempo limite de até uma hora.
cors As funções HTTP podem especificar políticas do CORS. Defina isso como true para permitir que todas as origens ou um string, regex ou array especifique as origens permitidas. Se não for definido explicitamente, o padrão será políticas de CORS falsas ou nenhuma.

Como configurar o compartilhamento de recursos entre origens (CORS, na sigla em inglês)

Use a opção cors para controlar quais origens podem acessar a função. Por padrão, as funções HTTP não têm o CORS configurado, o que significa que qualquer solicitação de origem cruzada para a função resulta neste erro:

request has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Também é possível desativar explicitamente o CORS definindo a opção cors como false para a função.

Para permitir algumas solicitações de origem cruzada, mas não todas, transmita uma lista de domínios específicos ou expressões regulares que precisam ser permitidas. Por exemplo, se você tem os domínios firebase.com e flutter.com, e firebase.com pode ter muitos subdomínios, defina a opção cors como [/firebase\.com$/, 'flutter.com']

Caso sua função precise estar disponível de maneira aberta, por exemplo, se ela estiver exibindo uma API ou um site público, defina a política cors como true.

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

Use onRequest() do subpacote firebase-functions/v2/https para criar uma função que gerencia eventos HTTP. O evento onRequest() é compatível com roteadores e apps gerenciados pelo framework da Web Express.

Os exemplos desta página foram criados com base em uma amostra de servidor de tempo, 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.

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 = onRequest(
    {timeoutSeconds: 1200, region: ["us-west1", "us-east1"]},
    (req, res) => {
  // ...
});

Como usar apps Express existentes

Ao usar o app como argumento de onRequest(), é possível transmitir um app Express completo para uma função HTTP.

const { onRequest } = require('firebase-functions/v2/https');

const express = require('express');
const app = express();

// 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 = onRequest(app);

Invocar uma função HTTP

Depois de implantar uma função HTTP, é possível invocá-la usando o URL exclusivo dela. Use a saída exata do URL da CLI após a implantação.

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

https://date-<random-hash>-<region>.a.run.app

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

Ler os valores da solicitação

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}`);
logger.log("Sending formatted date:", formattedDate);
res.status(200).send(formattedDate);

Como integrar com o 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.