HTTP-Funktionen schreiben
In Cloud Run Functions verwenden Sie HTTP-Funktionen, wenn Sie eine Funktion über eine HTTP(S)-Anfrage aufrufen möchten. Die HTTP-Funktionssignaturen akzeptieren HTTP-spezifische Argumente, und ermöglichen so HTTP-Semantik.
Implementierung
Das folgende Beispiel zeigt eine einfache Quelldatei der HTTP-Funktion für jede Laufzeit. Informationen zur Position Ihres Quellcodes finden Sie unter Quellverzeichnisstruktur.
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 registrieren Sie eine HTTP-Handler-Funktion mit dem Functions Framework für Node.js. Ihre HTTP-Handler-Funktion muss eine Express-Middleware-Funktion sein, die die Anfrage- und Antwortargumente akzeptiert und eine HTTP-Antwort sendet.
Cloud Run Functions parst den Anfragetext automatisch anhand des Content-Type
-Headers der Anfrage mithilfe von body-parser
, sodass Sie auf req.body
und req.rawBody
-Objekte im HTTP-Handler zugreifen können.
Der Funktionseinstiegspunkt ist der Name, mit dem der Handler beim Functions Framework registriert ist.
In diesem Beispiel ist der Einstiegspunkt 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 registrieren Sie eine HTTP-Handler-Funktion mit dem Functions Framework für Python. Ihre HTTP-Handler-Funktion muss ein Flask-Anfrageobjekt als Argument akzeptieren und einen Wert zurückgeben, den Flask in ein HTTP-Antwortobjekt konvertieren kann.
Der Funktionseinstiegspunkt ist der Name der Handler-Funktion, die bei Functions Framework registriert ist.
In diesem Beispiel ist der Einstiegspunkt 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 registrieren Sie eine HTTP-Handler-Funktion mit dem Functions Framework für Go in Ihrer init()
-Funktion. Ihre HTTP-Handler-Funktion muss die Standardschnittstelle http.HandlerFunc
verwenden, um eine HTTP-Antwort zu senden.
Der Funktionseinstiegspunkt ist der Name, mit dem der Handler beim Functions Framework registriert ist.
In diesem Beispiel ist der Einstiegspunkt MyHTTPFunction
.
Ihre HTTP-Handler-Funktion muss die Standardschnittstelle http.HandlerFunc
implementieren. Sie akzeptiert eine http.ResponseWriter-Schnittstelle, mit der Ihre Funktion eine Antwort auf die Anfrage erstellt und einen Verweis auf eine http.Request-Struktur, die die Details der eingehenden HTTP-Anfrage enthält.
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 verwenden Sie die Functions Framework Java API, um eine HTTP-Handler-Klasse mit der Schnittstelle HttpFunction
zu implementieren. Die Methode service()
muss eine HTTP-Antwort senden.
Der Funktionseinstiegspunkt ist der voll qualifizierte Name der HTTP-Handler-Klasse, einschließlich des Paketnamens. In diesem Beispiel ist der Einstiegspunkt myhttpfunction.MyHttpFunction
.
Die Methode service
empfängt ein HttpRequest
-Objekt, das die eingehende HTTP-Anfrage beschreibt, und ein HttpResponse
-Objekt, das von der Funktion mit einer Antwortnachricht ausgefüllt wird.
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");
}
}
}
In .NET-Laufzeiten verwenden Sie das Functions Framework für .NET, um eine HTTP-Handler-Klasse mit der Benutzeroberfläche IHttpFunction
. Die Methode HandleAsync()
akzeptiert ein Standard-ASP.NET-Objekt HttpContext
als Argument und muss eine HTTP-Antwort senden.
Der Funktionseinstiegspunkt ist der vollständig qualifizierte Name der HTTP-Handler-Klasse, einschließlich des Namespace.
In diesem Beispiel ist der Einstiegspunkt 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 registrieren Sie eine HTTP-Handler-Funktion mit dem Functions Framework für Ruby. Die HTTP-Handler-Funktion muss ein Rack-Anfrageobjekt als Argument akzeptieren und einen Wert zurückgeben, der als HTTP-Antwort verwendet werden kann.
Der Funktionseinstiegspunkt ist der Name, mit dem der Handler beim Functions Framework registriert ist.
In diesem Beispiel ist der Einstiegspunkt 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 registrieren Sie eine HTTP-Handler-Funktion mit dem Functions Framework für PHP.
Ihre HTTP-Handler-Funktion muss ein Argument akzeptieren, das die PSR-7-Schnittstelle ServerRequestInterface
implementiert, und muss eine HTTP-Antwort als String oder Objekt zurückgeben, das implementiert die PSR-7 Schnittstelle ResponseInterface
.
Der Funktionseinstiegspunkt ist der Name, mit dem der Handler beim Functions Framework registriert ist.
In diesem Beispiel ist der Einstiegspunkt myHttpFunction
.
HTTP-Anfragen und -Antworten
HTTP-Funktionen akzeptieren die auf der Seite HTTP-Trigger aufgeführten HTTP-Anfragemethoden. Ihr HTTP-Handler kann die Anfragemethode prüfen und je nach Methode verschiedene Aktionen ausführen.
Ihre Funktion muss eine HTTP-Antwort senden. Wenn die Funktion Hintergrundaufgaben erstellt (z. B. mit Threads, Futures, JavaScript-Promise
-Objekten, -Callbacks oder Systemprozessen), müssen Sie diese Aufgaben vor dem Senden einer HTTP-Antwort beenden oder anderweitig auflösen. Alle Aufgaben, die vor dem Senden der HTTP-Antwort nicht beendet wurden, sind möglicherweise nicht abgeschlossen und können ein nicht definiertes Verhalten verursachen.
Weitere Informationen zu HTTP-Funktionen und zugehörigen Optionen finden Sie unter HTTP-Trigger.
CORS verarbeiten
Mit Cross-Origin Resource Sharing (CORS) können Anwendungen, die auf einer Domain ausgeführt werden, auf Ressourcen einer anderen Domain zugreifen. Sie müssen beispielsweise zulassen können, dass Ihre Domain Anfragen an die Cloud Run Functions-Domain sendet, um auf Ihre Funktion zuzugreifen.
Wenn CORS nicht richtig eingerichtet ist, werden möglicherweise folgende Fehler angezeigt:
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.
Setzen Sie den Header Access-Control-Allow-Origin
entsprechend in Ihrer HTTP-Antwort, damit Cross-Origin-Anfragen an Ihre Funktion zugelassen werden. Bei Cross-Origin-Anfragen für Preflight-Anfragen müssen Sie auf die Preflight-Anfrage OPTIONS
mit einem 204
-Antwortcode und zusätzlichen Headern antworten.
Node.js
Python
Go
Java
C#
Ruby
PHP
CORS-Einschränkungen
Bei Preflight-Origin-Anfragen werden Preflight-OPTIONS
-Anfragen ohne Authorization
-Header gesendet. Daher werden sie bei allen HTTP-Funktionen abgelehnt, die eine Authentifizierung erfordern. Da die Preflight-Anfragen fehlschlagen, schlägt auch die Hauptanfrage fehl. Verwenden Sie eine der folgenden Optionen, um diese Einschränkung zu umgehen:
- Nicht authentifizierte Aufrufe der Funktion zulassen
- Hosten Sie Ihre Webanwendung und Cloud Run Functions auf derselben Domain, um CORS zu vermeiden. Dazu müssen Sie Firebase Hosting in Cloud Run Functions einbinden.
Weitere Informationen
- Erfahren Sie mehr über HTTP-Trigger.
- Erfahren Sie mehr über das Bereitstellen einer Cloud Run Functions-Funktion.
- Die Anleitung zu HTTP-Funktionen enthält ein Beispiel für das Schreiben, Bereitstellen und Aufrufen einer HTTP-Funktion.