Scrivi funzioni HTTP
In Cloud Functions, utilizzi le funzioni HTTP quando vuoi richiamare una funzione tramite una richiesta HTTP(S). Per consentire la semantica HTTP, le firme delle funzioni HTTP accettano argomenti specifici per HTTP.
Implementazione
L'esempio seguente mostra un file di origine di funzioni HTTP di base per ogni runtime. Consulta Struttura della directory di origine per informazioni su dove trovare il codice sorgente.
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');
});
In Node.js, registri una funzione gestore HTTP con il framework delle funzioni per Node.js. La funzione gestore HTTP deve essere una funzione middleware Express che accetta gli argomenti di richiesta e risposta e invia una risposta HTTP.
Cloud Functions analizza automaticamente il corpo della richiesta in base all'intestazione Content-Type
della richiesta utilizzando body-parser
, in modo che tu possa accedere agli oggetti req.body
e req.rawBody
nel gestore HTTP.
Il punto di ingresso della funzione è il nome con cui il gestore è registrato nel framework di Functions.
In questo esempio, il punto di ingresso è 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'
In Python, registri una funzione gestore HTTP con il framework delle funzioni per Python. La funzione gestore HTTP deve accettare un oggetto richiesta Flask come argomento e restituire un valore che Flask può convertire in un oggetto di risposta HTTP.
Il punto di ingresso della funzione è il nome della funzione gestore registrata con il framework di Functions.
In questo esempio, il punto di ingresso è 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")
}
In Go, registri una funzione gestore HTTP con il framework delle funzioni per Go nella funzione init()
. La funzione gestore HTTP deve utilizzare l'interfaccia http.HandlerFunc
standard per inviare una risposta HTTP.
Il punto di ingresso della funzione è il nome con cui il gestore è registrato nel framework di Functions.
In questo esempio, il punto di ingresso è MyHTTPFunction
.
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");
}
}
In Java, puoi utilizzare l'API Functions Java del framework per implementare una classe di gestore HTTP con l'interfaccia HttpFunction
. Il metodo service()
deve inviare una risposta HTTP.
Il punto di ingresso della funzione è il nome completo della classe del gestore HTTP, incluso il nome del pacchetto. In questo esempio, il punto di ingresso è myhttpfunction.MyHttpFunction
.
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");
}
}
}
Nei runtime .NET, viene utilizzato il framework delle funzioni per .NET per implementare una classe di gestore HTTP con l'interfaccia IHttpFunction
. Il metodo HandleAsync()
accetta un oggetto ASP.NET
HttpContext
standard come argomento e deve inviare una risposta HTTP.
Il punto di ingresso della funzione è il nome completo della classe del gestore HTTP, incluso lo spazio dei nomi.
In questo esempio, il punto di ingresso è 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
In Ruby, registri una funzione gestore HTTP con il Framework di funzioni per Ruby. La funzione gestore HTTP deve accettare un oggetto richiesta Rack come argomento e restituire un valore utilizzabile come risposta HTTP.
Il punto di ingresso della funzione è il nome con cui il gestore è registrato nel framework di Functions.
In questo esempio, il punto di ingresso è 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';
}
In PHP, registri una funzione gestore HTTP con il framework delle funzioni per PHP.
La funzione gestore HTTP deve accettare un argomento che implementi l'interfaccia PSR-7 ServerRequestInterface
e deve restituire una risposta HTTP sotto forma di stringa o oggetto che implementa l'interfaccia ResponseInterface
PSR-7.
Il punto di ingresso della funzione è il nome con cui il gestore è registrato nel framework di Functions.
In questo esempio, il punto di ingresso è myHttpFunction
.
Le funzioni HTTP accettano i metodi di richiesta HTTP elencati nella pagina Trigger HTTP. Il gestore HTTP può esaminare il metodo di richiesta ed eseguire azioni diverse in base al metodo.
La funzione deve inviare una risposta HTTP. Se la funzione crea attività in background (ad esempio, con thread, future, oggetti Promise
JavaScript, callback o processi di sistema), devi terminare o altrimenti risolvere queste attività prima di inviare una risposta HTTP. Qualsiasi attività non terminata prima dell'invio della risposta HTTP potrebbe non essere completata e potrebbe causare un comportamento indefinito.
Consulta Trigger HTTP per ulteriori informazioni sulle funzioni HTTP e sulle opzioni associate.
Gestione di CORS
La condivisione delle risorse tra origini (CORS) è un modo per consentire alle applicazioni in esecuzione su un dominio di accedere alle risorse di un altro dominio. Ad esempio, potrebbe essere necessario consentire al dominio di effettuare richieste al dominio Cloud Functions per accedere alla funzione.
Se CORS non è configurato correttamente, potresti visualizzare errori come i seguenti:
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.
Per consentire le richieste multiorigine alla funzione, imposta l'intestazione Access-Control-Allow-Origin
in modo appropriato nella risposta HTTP. Per le richieste multiorigine preflight, devi rispondere alla richiesta OPTIONS
preflight con un codice di risposta 204
e intestazioni aggiuntive.
Node.js
Python
Go
Java
C#
Ruby
PHP
Limitazioni di CORS
Per le richieste multiorigine preflight, le richieste OPTIONS
preflight vengono inviate senza un'intestazione Authorization
, quindi saranno rifiutate in tutte le funzioni HTTP che richiedono l'autenticazione. Poiché le richieste preflight non vanno a buon fine, anche le richieste principali avranno esito negativo. Per ovviare a questo limite, utilizza una delle seguenti opzioni:
- Consenti chiamate non autenticate della funzione.
- Ospita la tua app web e Cloud Functions sullo stesso dominio per evitare CORS. Puoi farlo integrando Firebase Hosting con Cloud Functions.
Passaggi successivi
- Scopri di più sui trigger HTTP.
- Scopri come eseguire il deployment di una funzione Cloud Functions.
- Consulta il tutorial sulle funzioni HTTP per un esempio di scrittura, deployment e chiamata di una funzione HTTP.