No Cloud Run, você escreve uma função HTTP quando quer invocar uma função por meio de uma solicitação HTTP(S). Para permitir a semântica HTTP, use o framework de função e especifique a assinatura da função HTTP para aceitar argumentos específicos de HTTP.
Implementar funções de manipuladores HTTP
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 do Express que aceita os argumentos de solicitação e resposta e envia uma resposta HTTP.
O Cloud Run analisa automaticamente o corpo da solicitação com base no
cabeçalho Content-Type
da solicitação usando
body-parser
.
Assim, você pode acessar os objetos req.body
e 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 de função
é o nome com que o gerenciador está registrado 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 da 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.
.NET
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 da 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
Quando você registra uma função de gerenciador HTTP com o Framework de funções, o gerenciador HTTP pode inspecionar o método da solicitação e executar diferentes ações com base no método.
Quando você configura um provedor de eventos para enviar solicitações HTTP à sua função do Cloud Run, ela envia uma resposta HTTP. Se a função criar tarefas em segundo plano (como com linhas de execução, contratos futuros, objetos Promise do JavaScript, callbacks ou processos do sistema), será 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.
Como processar o suporte a CORs / 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.
Para permitir solicitações de origem cruzada 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
.NET
Ruby
PHP
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.
Limitações do CORS
Para solicitações de origem cruzada de simulação, as solicitações OPTIONS de simulação são enviadas sem um cabeçalho de autorização. Portanto, elas são rejeitadas em todas as funções HTTP que exigem autenticação. Como há falha nas solicitações simuladas, as solicitações principais também falharão. 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 no mesmo domínio para evitar o CORS. Para fazer isso, integre o Firebase Hosting ao Cloud Run functions.