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 ao implantar funções, 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:
- analisador de corpo de arquivos JSON
- analisador de corpo de arquivos Raw
- analisador de corpo de texto
- analisador de corpo de formulário codificado pelo URL
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 |
"algo" |
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
É possível conectar uma função HTTP ao Firebase Hosting. As solicitações no 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.