Go Template Anleitung
Dieses Dokument beschreibt die Verwendung von Go Template in MCP Gateway zur Verarbeitung von Anfrage- und Antwortdaten. Go Template bietet leistungsstarke Template-Funktionen, die uns helfen, Daten flexibel zu transformieren und zu formatieren.
Grundlegende Syntax
Go Template verwendet {{}} als Begrenzer, innerhalb derer verschiedene Funktionen und Variablen verwendet werden können. In MCP Gateway verwenden wir hauptsächlich die folgenden Variablen:
.Config: Service-Level-Konfiguration.Args: Anfrageparameter.Request: Originale Anfrageinformationen.Response: Upstream-Service-Antwortinformationen
Häufige Anwendungsfälle
1. Konfiguration aus Umgebungsvariablen abrufen
config:
Authorization: 'Bearer {{ env "AUTH_TOKEN" }}' # Konfiguration aus Umgebungsvariable abrufen
2. Werte aus Anfrage-Headern extrahieren
headers:
Authorization: "{{.Request.Headers.Authorization}}" # Authorization-Header des Clients weiterleiten
Cookie: "{{.Config.Cookie}}" # Wert aus der Service-Konfiguration verwenden
3. Anfrage-Body erstellen
requestBody: |-
{
"username": "{{.Args.username}}",
"email": "{{.Args.email}}"
}
4. Antwortdaten verarbeiten
responseBody: |-
{
"id": "{{.Response.Data.id}}",
"username": "{{.Response.Data.username}}",
"email": "{{.Response.Data.email}}",
"createdAt": "{{.Response.Data.createdAt}}"
}
5. Verschachtelte Antwortdaten verarbeiten
responseBody: |-
{
"id": "{{.Response.Data.id}}",
"username": "{{.Response.Data.username}}",
"email": "{{.Response.Data.email}}",
"createdAt": "{{.Response.Data.createdAt}}",
"preferences": {
"isPublic": {{.Response.Data.preferences.isPublic}},
"showEmail": {{.Response.Data.preferences.showEmail}},
"theme": "{{.Response.Data.preferences.theme}}",
"tags": {{.Response.Data.preferences.tags}}
}
}
6. Array-Daten verarbeiten
Bei der Verarbeitung von Array-Daten in Antworten können Sie die range-Funktionalität von Go Template verwenden:
responseBody: |-
{
"total": "{{.Response.Data.total}}",
"rows": [
{{- $len := len .Response.Data.rows -}}
{{- $rows := fromJSON .Response.Data.rows }}
{{- range $i, $e := $rows }}
{
"id": {{ $e.id }},
"detail": "{{ $e.detail }}",
"deviceName": "{{ $e.deviceName }}"
}{{ if lt (add $i 1) $len }},{{ end }}
{{- end }}
]
}
Dieses Beispiel zeigt:
- Verwendung der
fromJSON-Funktion zum Konvertieren eines JSON-Strings in ein durchsuchbares Objekt - Verwendung von
rangezum Durchlaufen des Arrays - Verwendung der
len-Funktion zum Abrufen der Array-Länge - Verwendung der
add-Funktion für mathematische Operationen - Verwendung von bedingten Anweisungen zur Steuerung der Kommatrennung zwischen Array-Elementen
7. Parameter in URLs verwenden
endpoint: "http://localhost:5236/users/{{.Args.email}}/preferences"
8. Komplexe Objektdaten verarbeiten
Wenn Sie komplexe Strukturen wie Objekte oder Arrays in Anfragen oder Antworten in JSON umwandeln müssen, können Sie die Funktion toJSON verwenden:
requestBody: |-
{
"isPublic": {{.Args.isPublic}},
"showEmail": {{.Args.showEmail}},
"theme": "{{.Args.theme}}",
"tags": {{.Args.tags}},
"settings": {{ toJSON .Args.settings }}
}
In diesem Fall ist settings ein komplexes Objekt, das mit der Funktion toJSON automatisch in einen JSON-String umgewandelt wird.
Eingebaute Funktionen
Aktuell unterstützte eingebaute Funktionen:
-
env: Umgebungsvariablenwert abrufenAuthorization: 'Bearer {{ env "AUTH_TOKEN" }}' -
add: Ganzzahladdition durchführen{{ if lt (add $i 1) $len }},{{ end }} -
fromJSON: JSON-String in durchsuchbares Objekt konvertieren{{- $rows := fromJSON .Response.Data.rows }} -
toJSON: Objekt in JSON-String konvertieren"settings": {{ toJSON .Args.settings }}
Um neue Template-Funktionen hinzuzufügen:
- Spezifischen Anwendungsfall beschreiben und ein Issue erstellen
- PR-Beiträge sind willkommen, aber derzeit werden nur allgemeine Funktionen akzeptiert