Use um gerenciador de solicitações para acionar uma função com uma solicitação HTTP. 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 (timeout_sec para Python) |
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 entre origens 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 se firebase.com
pode
ter muitos subdomínios, defina a opção cors
como
[/firebase\.com$/, 'flutter.com']
para Node.js ou
[r'firebase\.com$', r'https://flutter\.com']
para Python:
Node.js
const { onRequest } = require("firebase-functions/v2/https");
exports.sayHello = onRequest(
{ cors: [/firebase\.com$/, "flutter.com"] },
(req, res) => {
res.status(200).send("Hello world!");
}
);
Python
from firebase_functions import https_fn, options
@https_fn.on_request(
cors=options.CorsOptions(
cors_origins=[r"firebase\.com$", r"https://flutter\.com"],
cors_methods=["get", "post"],
)
)
def say_hello(req: https_fn.Request) -> https_fn.Response:
return https_fn.Response("Hello world!")
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 o gerenciador de solicitações da plataforma (onRequest()
ou on_request
)
para criar uma função que gerencie eventos HTTP. Os exemplos desta seção são baseados em uma amostra de "servidor de tempo" que é acionada quando você envia uma solicitação GET
HTTP 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
O objeto de solicitação dá acesso às propriedades da solicitação HTTP enviada pelo cliente, e o objeto de resposta permite enviar uma resposta ao cliente.
Node.js
exports.date = onRequest( {timeoutSeconds: 1200, region: ["us-west1", "us-east1"]}, (req, res) => { // ... });
Python
@https_fn.on_request(cors=options.CorsOptions(cors_origins="*", cors_methods=["get", "post"]))
def date(req: https_fn.Request) -> https_fn.Response:
"""Get the server's local date and time."""
Como usar apps Express ou Flask
Usando o app como argumento para o gerenciador de solicitações, você pode passar um app completo para uma função HTTP:
Node.js
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);
Python
from firebase_admin import initialize_app, db
from firebase_functions import https_fn
import flask
initialize_app()
app = flask.Flask(__name__)
# Build multiple CRUD interfaces:
@app.get("/widgets")
@app.get("/widgets/<id>")
def get_widget(id=None):
if id is not None:
return db.reference(f"/widgets/{id}").get()
else:
return db.reference("/widgets").get()
@app.post("/widgets")
def add_widget():
new_widget = flask.request.get_data(as_text=True)
db.reference("/widgets").push(new_widget)
return flask.Response(status=201, response="Added widget")
# Expose Flask app as a single Cloud Function:
@https_fn.on_request()
def httpsflaskexample(req: https_fn.Request) -> https_fn.Response:
with app.request_context(req.environ):
return app.full_dispatch_request()
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://us-central1-<project-id>.cloudfunctions.net/date
Com o roteamento de app do Express e do Flask, o nome da função é adicionado como um prefixo aos caminhos do URL no app 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:
Node.js
let format = req.query.format; format = req.body.format;
Python
format = req.args["format"] if "format" in req.args else None
Encerrar funções HTTP
Depois de recuperar e formatar o horário do servidor, a função date()
termina enviando o resultado na resposta HTTP:
Node.js
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.
const formattedDate = moment().format(`${format}`); logger.log("Sending formatted date:", formattedDate); res.status(200).send(formattedDate);
Python
formatted_date = datetime.now().strftime(format)
print(f"Sending Formatted date: {formatted_date}")
return https_fn.Response(formatted_date)
Como integrar com o 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.