Guía de uso de Go Template
Este documento explica cómo usar Go Template en MCP Gateway para manejar datos de solicitud y respuesta. Go Template proporciona capacidades de plantilla potentes que nos ayudan a procesar de manera flexible la transformación y el formateo de datos.
Sintaxis básica
Go Template usa {{}}
como delimitadores, dentro de los cuales se pueden usar varias funciones y variables. En MCP Gateway, principalmente usamos las siguientes variables:
.Config
: Configuración a nivel de servicio.Args
: Parámetros de solicitud.Request
: Información de solicitud original.Response
: Información de respuesta del servicio upstream
Casos de uso comunes
1. Obtener configuración desde variables de entorno
config:
Authorization: 'Bearer {{ env "AUTH_TOKEN" }}' # Obtener configuración desde variable de entorno
2. Extraer valores desde encabezados de solicitud
headers:
Authorization: "{{.Request.Headers.Authorization}}" # Reenviar encabezado Authorization del cliente
Cookie: "{{.Config.Cookie}}" # Usar valor de la configuración del servicio
3. Construir cuerpo de solicitud
requestBody: |-
{
"username": "{{.Args.username}}",
"email": "{{.Args.email}}"
}
4. Procesar datos de respuesta
responseBody: |-
{
"id": "{{.Response.Data.id}}",
"username": "{{.Response.Data.username}}",
"email": "{{.Response.Data.email}}",
"createdAt": "{{.Response.Data.createdAt}}"
}
5. Procesar datos de respuesta anidados
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. Procesar datos de array
Al procesar datos de array en respuestas, puedes usar la funcionalidad range de Go Template:
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 }}
]
}
Este ejemplo demuestra:
- Usar la función
fromJSON
para convertir una cadena JSON en un objeto recorrible - Usar
range
para iterar sobre el array - Usar la función
len
para obtener la longitud del array - Usar la función
add
para operaciones matemáticas - Usar declaraciones condicionales para controlar la separación por comas entre elementos del array
7. Usar parámetros en URLs
endpoint: "http://localhost:5236/users/{{.Args.email}}/preferences"
8. Manejar datos de objetos complejos
Cuando necesites convertir estructuras complejas como objetos o arrays en solicitudes o respuestas a JSON, puedes usar la función toJSON
:
requestBody: |-
{
"isPublic": {{.Args.isPublic}},
"showEmail": {{.Args.showEmail}},
"theme": "{{.Args.theme}}",
"tags": {{.Args.tags}},
"settings": {{ toJSON .Args.settings }}
}
En este caso, settings
es un objeto complejo que será convertido automáticamente a una cadena JSON usando la función toJSON
.
Funciones incorporadas
Funciones incorporadas actualmente soportadas:
-
env
: Obtener valor de variable de entornoAuthorization: 'Bearer {{ env "AUTH_TOKEN" }}'
-
add
: Realizar suma de enteros{{ if lt (add $i 1) $len }},{{ end }}
-
fromJSON
: Convertir cadena JSON en objeto recorrible{{- $rows := fromJSON .Response.Data.rows }}
-
toJSON
: Convertir un objeto a cadena JSON"settings": {{ toJSON .Args.settings }}
Para agregar nuevas funciones de plantilla:
- Describir el caso de uso específico y crear un issue
- Se aceptan contribuciones PR, pero actualmente solo se aceptan funciones de propósito general