Saltar al contenido principal

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:

  1. Usar la función fromJSON para convertir una cadena JSON en un objeto recorrible
  2. Usar range para iterar sobre el array
  3. Usar la función len para obtener la longitud del array
  4. Usar la función add para operaciones matemáticas
  5. 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:

  1. env: Obtener valor de variable de entorno

    Authorization: 'Bearer {{ env "AUTH_TOKEN" }}'
  2. add: Realizar suma de enteros

    {{ if lt (add $i 1) $len }},{{ end }}
  3. fromJSON: Convertir cadena JSON en objeto recorrible

    {{- $rows := fromJSON .Response.Data.rows }}
  4. toJSON: Convertir un objeto a cadena JSON

    "settings": {{ toJSON .Args.settings }}

Para agregar nuevas funciones de plantilla:

  1. Describir el caso de uso específico y crear un issue
  2. Se aceptan contribuciones PR, pero actualmente solo se aceptan funciones de propósito general

Recursos adicionales