Escrever funções HTTP
No Cloud Run functions, você usa funções HTTP quando quiser invocar uma função por meio de uma solicitação HTTP(S). Para permitir a semântica, as assinaturas da função HTTP aceitam argumentos específicos de HTTP.
Implementação
O exemplo a seguir mostra um arquivo de origem da função HTTP básico para cada ambiente de execução. Consulte Estrutura do diretório de origem para ver informações sobre onde localizar o código-fonte.
Node.js
const functions = require('@google-cloud/functions-framework');
// Register an HTTP function with the Functions Framework
functions.http('myHttpFunction', (req, res) => {
// Your code here
// Send an HTTP response
res.send('OK');
});
No Node.js, você registra uma função de gerenciador HTTP com o Framework do Functions para Node.js. A função de gerenciador HTTP precisa ser uma função de middleware Express que aceita os argumentos de solicitação e resposta e envia uma resposta HTTP.
O Cloud Run functions analisa automaticamente o corpo da solicitação com base no
cabeçalho Content-Type
da solicitação usando
body-parser
.
Assim, você pode acessar req.body
e Objetos req.rawBody
no seu gerenciador HTTP.
O
ponto de entrada de função
é o nome com que o gerenciador está registrado no Functions Framework.
Neste exemplo, o ponto de entrada é myHttpFunction
.
Python
import functions_framework
# Register an HTTP function with the Functions Framework
@functions_framework.http
def my_http_function(request):
# Your code here
# Return an HTTP response
return 'OK'
Em Python, você registra uma função de gerenciador HTTP com o Framework de funções para Python. A função de gerenciador HTTP precisa aceitar um objeto de solicitação do Flask como argumento e retornar um valor que o Flask pode converter em um objeto de resposta HTTP.
O
ponto de entrada da função
é o nome da função do gerenciador registrada no Functions Framework.
Neste exemplo, o ponto de entrada é my_http_function
.
Go
package myhttpfunction
import (
"fmt"
"net/http"
"github.com/GoogleCloudPlatform/functions-framework-go/functions"
)
func init() {
// Register an HTTP function with the Functions Framework
functions.HTTP("MyHTTPFunction", myHTTPFunction)
}
// Function myHTTPFunction is an HTTP handler
func myHTTPFunction(w http.ResponseWriter, r *http.Request) {
// Your code here
// Send an HTTP response
fmt.Fprintln(w, "OK")
}
Em Go, registre uma função de gerenciador HTTP com o
Framework de funções para Go
na sua função init()
. A função de gerenciador HTTP precisa usar a interface http.HandlerFunc
padrão para enviar uma resposta HTTP.
O
ponto de entrada de função
é o nome com que o gerenciador está registrado no Functions Framework.
Neste exemplo, o ponto de entrada é MyHTTPFunction
.
Sua função de gerenciador HTTP precisa implementar a interface
http.HandlerFunc
padrão. Ele aceita uma interface http.ResponseWriter que sua função usa para
criar uma resposta à solicitação e um ponteiro para um struct http.Request contendo os detalhes do solicitação HTTP recebida.
Java
package myhttpfunction;
import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
// Define a class that implements the HttpFunction interface
public class MyHttpFunction implements HttpFunction {
// Implement the service() method to handle HTTP requests
@Override
public void service(HttpRequest request, HttpResponse response) throws Exception {
// Your code here
// Send an HTTP response
response.getWriter().write("OK");
}
}
Em Java, use a
API Functions Framework para Java
para implementar uma classe de gerenciador HTTP com a interface
HttpFunction
. O método service()
precisa enviar uma resposta HTTP.
O
ponto de entrada de função
é o nome totalmente qualificado da classe de gerenciador HTTP, incluindo o nome do
pacote. Neste exemplo, o ponto de entrada é myhttpfunction.MyHttpFunction
.
O método service
recebe um objeto HttpRequest
que descreve a solicitação HTTP de entrada e um objeto HttpResponse
que sua função preenche com uma mensagem de resposta.
C#
using Google.Cloud.Functions.Framework;
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
namespace MyProject
{
// Define a class that implements the IHttpFunction interface
public class MyHttpFunction : IHttpFunction
{
// Implement the HandleAsync() method to handle HTTP requests
public async Task HandleAsync(HttpContext context)
{
// Your code here
// Send an HTTP response
await context.Response.WriteAsync("OK");
}
}
}
Nos ambientes de execução do .NET, use o
Functions Framework para .NET
para implementar uma classe de gerenciador HTTP com a interface
IHttpFunction
. O método HandleAsync()
aceita um objeto HttpContext
padrão do ASP.NET como argumento e precisa enviar uma resposta HTTP.
O ponto de entrada de função é o nome totalmente qualificado da classe de gerenciador HTTP, incluindo o namespace.
Neste exemplo, o ponto de entrada é MyProject.MyHttpFunction
.
Ruby
require "functions_framework"
# Register an HTTP function with the Functions Framework
FunctionsFramework.http "my_http_function" do |request|
# Your code here
# Return an HTTP response
"OK"
end
No Ruby, você registra uma função de gerenciador HTTP com o frameworks Functions para Ruby. A função de gerenciador HTTP precisa aceitar um objeto Solicitação de rack como um argumento e retornar um valor que pode ser usado como uma resposta HTTP.
O
ponto de entrada de função
é o nome com que o gerenciador está registrado no Functions Framework.
Neste exemplo, o ponto de entrada é my_http_function
.
PHP
<?php
use Google\CloudFunctions\FunctionsFramework;
use Psr\Http\Message\ServerRequestInterface;
// Register an HTTP function with the Functions Framework
FunctionsFramework::http('myHttpFunction', 'myHttpHandler');
// Define your HTTP handler
function myHttpHandler(ServerRequestInterface $request): string
{
// Your code here
// Return an HTTP response
return 'OK';
}
Em PHP, você registra uma função de gerenciador HTTP com o
Framework de funções para PHP.
A função de gerenciador HTTP precisa aceitar um argumento que implemente a interface ServerRequestInterface
do PSR-7
e retornar uma resposta HTTP como uma string ou um objeto que
implemente a interface ResponseInterface
do PSR-7.
O
ponto de entrada de função
é o nome com que o gerenciador está registrado no Functions Framework.
Neste exemplo, o ponto de entrada é myHttpFunction
.
Solicitações e respostas HTTP
As funções HTTP aceitam os métodos de solicitação HTTP listados na página Acionadores HTTP. Seu gerenciador HTTP pode inspecionar o método da solicitação e executar diferentes ações com base no método.
Sua função precisa enviar uma resposta HTTP. Se a função criar tarefas em segundo plano, como com linhas de execução, contratos futuros, objetos JavaScript Promise
, callbacks ou processos do sistema), é necessário encerrar ou resolver essas tarefas antes de enviar uma resposta HTTP. Qualquer tarefa não encerrada antes do envio da resposta HTTP pode
não ser concluída e pode causar um comportamento indefinido.
Consulte Acionadores HTTP para mais informações sobre funções HTTP e opções associadas.
Como gerenciar CORS
O Compartilhamento de recursos entre origens (CORS) é uma forma de permitir que aplicativos executados em um domínio acessem recursos de outro domínio. Por exemplo, talvez seja necessário permitir que o domínio faça solicitações ao domínio do Cloud Run functions para acessar a função.
Se o CORS não estiver configurado corretamente, poderão aparecer erros como os seguintes:
XMLHttpRequest cannot load https://YOUR_FUNCTION_URL. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://YOUR_DOMAIN' is therefore not allowed access.
Para permitir solicitação entre origens para sua função, defina o cabeçalho Access-Control-Allow-Origin
conforme apropriado na sua resposta HTTP. Para
solicitações de origem cruzada simuladas,
é necessário responder à solicitação OPTIONS
de simulação com um código de resposta 204
e cabeçalhos adicionais.
Node.js
Python
Go
Java
C#
Ruby
PHP
Limitações do CORS
Para solicitações de origem cruzada de simulação, as solicitações de simulação de OPTIONS
são enviadas
sem um cabeçalho Authorization
. Portanto, elas serão rejeitadas em todas as funções HTTP
que exigem autenticação. Como há falha nas
solicitações simuladas, a solicitação principal também falhará. Para contornar essa limitação, use uma das
seguintes opções:
- Permita invocações não autenticadas da sua função.
- Hospede seu app da Web e o Cloud Run functions no mesmo domínio para evitar CORS. Para fazer isso, integre o Firebase Hosting ao Cloud Run functions.
Próximas etapas
- Saiba mais sobre acionadores HTTP.
- Saiba como implantar uma função do Cloud Run.
- Consulte o tutorial de função HTTP para ver um exemplo de gravação, implantação e chamada de função HTTP.