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