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

Como na v1, você pode acionar uma função por meio de uma solicitação HTTP com o manipulador onRequest() . Isso permite invocar uma função por meio dos seguintes métodos HTTP suportados: GET , POST , PUT , DELETE e OPTIONS .

Opções HTTP adicionais

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 será implantada para 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 CORS. Você pode definir isso como true para permitir todas as origens ou uma string , regex ou array para especificar as origens permitidas. Padrões para políticas falsas/sem CORS se não forem definidas explicitamente.

Configurando CORS (Compartilhamento de Recursos de Origem Cruzada)

Use a opção cors para controlar quais origens podem acessar sua 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 sua função resulta neste erro:

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

Você também pode desabilitar explicitamente o CORS configurando a opção cors como false para sua função.

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

Se sua função deve estar disponível abertamente, por exemplo, se estiver atendendo a uma API ou site público, defina a política cors como true .

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

Use onRequest() do subpacote firebase firebase-functions/v2/https para criar uma função que lide com eventos HTTP. O evento onRequest() oferece suporte a roteadores e aplicativos gerenciados pela estrutura da Web Express .

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

Usando objetos de solicitação e resposta expressos

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

Usando aplicativos Express existentes

Usando App como argumento para onRequest() , você pode passar um aplicativo 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, você pode invocá-la por meio de sua própria URL exclusiva. Use a saída de URL exata da CLI após a implantação.

Por exemplo, a URL para invocar date() se parece com isso:

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

Com o roteamento de aplicativo expresso, o nome da função é adicionado como um prefixo aos caminhos de URL no aplicativo que você define.

Ler valores da solicitação

No exemplo da função date() , a função testa o parâmetro 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 termine uma função HTTP com send() , redirect() ou end() . Caso contrário, sua função pode continuar a ser executada e ser encerrada à força pelo sistema. Consulte também Sincronização, Assíncrona e Promessas .

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

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

Integração 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 enviadas por 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 .