Configuración de solucionadores (VTL) - AWS AppSync

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Configuración de solucionadores (VTL)

nota

Ahora admitimos de forma básica el tiempo de ejecución APPSYNC_JS y su documentación. Considere la opción de utilizar el tiempo de ejecución APPSYNC_JS y sus guías aquí.

Los solucionadores de GraphQL conectan los campos de un esquema de tipo a un origen de datos. Los solucionadores son el mecanismo mediante el cual se atienden las solicitudes. AWS AppSync puede crear y conectar solucionadores automáticamente desde un esquema o crear un esquema y conectar solucionadores desde una tabla existente sin que tenga que escribir código.

Los solucionadores de AWS AppSync utilizan JavaScript para convertir una expresión de GraphQL en un formato que pueda utilizar el origen de datos. Como alternativa, las plantillas de asignación se pueden escribir en Apache Velocity Template Language (VTL) para convertir una expresión de GraphQL en un formato que el origen de datos pueda utilizar.

En esta sección se mostrará cómo configurar los solucionadores mediante VTL. Puede consultar una guía de programación a modo de tutorial para escribir solucionadores en Guía de programación de plantillas de asignación de solucionadores y herramientas de ayuda para la programación en Referencia de contexto de las plantillas de asignación de solucionadores. AWS AppSync también tiene flujos de prueba y depuración integrados que se pueden usar al editar o crear desde cero. Para obtener más información, consulte la sección sobre la prueba y depuración de solucionadores.

Recomendamos seguir esta guía antes de intentar utilizar alguno de los tutoriales mencionados anteriormente.

En esta sección, veremos cómo crear un solucionador, añadir un solucionador para mutaciones y usar configuraciones avanzadas.

Cree su primer solucionador

Siguiendo los ejemplos de las secciones anteriores, el primer paso es crear un solucionador para su tipo de Query.

Console
  1. Inicie sesión en la AWS Management Console y abra la consola de AppSync.

    1. En el panel de API, seleccione su API de GraphQL.

    2. En la barra lateral, seleccione Esquema.

  2. En la parte derecha de la página, hay una ventana llamada Solucionadores. Este cuadro contiene una lista de los tipos y campos definidos en la ventana Esquema del lado izquierdo de la página. Puede asociar solucionadores a los campos. Por ejemplo, en el tipo de Consulta, seleccione Asociar junto al campo getTodos.

  3. En la página Crear un solucionador, elija el origen de datos que creó en la guía Asociar un origen de datos. En la ventana Configurar plantillas de asignación, puede elegir las plantillas de asignación genéricas de solicitud y respuesta utilizando la lista desplegable de la derecha o escribir las suyas propias.

    nota

    El emparejamiento de una plantilla de asignación de solicitudes con una plantilla de asignación de respuestas se denomina solucionador unitario. Los solucionadores unitarios suelen estar diseñados para realizar operaciones rutinarias; recomendamos usarlos solo para operaciones singulares con un número reducido de orígenes de datos. Para operaciones más complejas, recomendamos utilizar solucionadores de canalización, que pueden ejecutar varias operaciones con diversos orígenes de datos de forma secuencial.

    Para obtener más información acerca de la diferencia entre las plantillas de asignación de solicitudes y respuestas, consulte Solucionadores unitarios.

    Para obtener más información sobre el uso de solucionadores de canalización, consulte Solucionadores de canalización.

  4. Para los casos de uso comunes, la consola de AWS AppSync tiene plantillas integradas que puede utilizar para obtener elementos de orígenes de datos (por ejemplo, todas las consultas de elementos, búsquedas individuales, etc.). Por ejemplo en la versión sencilla del esquema que se da en la sección Diseño del esquema en la que getTodos no tenía paginación, la plantilla de asignación de solicitudes para enumerar elementos es la siguiente:

    { "version" : "2017-02-28", "operation" : "Scan" }
  5. Siempre se necesita una plantilla de asignación de respuestas para complementar la solicitud. La consola ofrece un valor predeterminado con el siguiente valor de acceso directo para las listas:

    $util.toJson($ctx.result.items)

    En este ejemplo, el objeto context (con el alias $ctx) para las listas de elementos tiene la forma $context.result.items. Si su operación de GraphQL devuelve un solo elemento, este sería $context.result. AWS AppSync proporciona funciones auxiliares para operaciones comunes, como la función $util.toJson indicada anteriormente, con el fin de aplicar un formato correcto a las respuestas. Para ver una lista completa de funciones, consulte Referencia de utilidad de la plantilla de asignación de solucionadores.

  6. Seleccione Guardar solucionador.

API
  1. Cree un objeto de resolución llamando a la API de CreateResolver.

  2. Puede modificar los campos del solucionador llamando a la API de UpdateResolver.

CLI
  1. Cree un solucionador ejecutando el comando create-resolver.

    Deberá escribir 6 parámetros para este comando concreto:

    1. El api-id de su API.

    2. El type-name del tipo que quiere modificar en su esquema. En el ejemplo de la consola, esto era Query.

    3. El field-name del campo que quiere modificar en su tipo. En el ejemplo de la consola, esto era getTodos.

    4. El data-source-name del origen de datos que creó en la guía Asociar un origen de datos.

    5. La request-mapping-template, que es el cuerpo de la solicitud. En el ejemplo de la consola, esto era:

      { "version" : "2017-02-28", "operation" : "Scan" }
    6. La response-mapping-template, que es el cuerpo de la respuesta. En el ejemplo de la consola, esto era:

      $util.toJson($ctx.result.items)

    Un comando de ejemplo puede tener este aspecto:

    aws appsync create-resolver --api-id abcdefghijklmnopqrstuvwxyz --type-name Query --field-name getTodos --data-source-name TodoTable --request-mapping-template "{ "version" : "2017-02-28", "operation" : "Scan", }" --response-mapping-template ""$"util.toJson("$"ctx.result.items)"

    Aparecerá un resultado en la CLI. A continuación se muestra un ejemplo:

    { "resolver": { "kind": "UNIT", "dataSourceName": "TodoTable", "requestMappingTemplate": "{ version : 2017-02-28, operation : Scan, }", "resolverArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/Query/resolvers/getTodos", "typeName": "Query", "fieldName": "getTodos", "responseMappingTemplate": "$util.toJson($ctx.result.items)" } }
  2. Para modificar los campos y/o las plantillas de asignación de un solucionador, ejecute el comando update-resolver.

    Con la excepción del parámetro api-id, los parámetros utilizados en el comando create-resolver se sobrescribirán con los nuevos valores del comando update-resolver.

Adición de un solucionador para mutaciones

El siguiente paso es crear un solucionador para su tipo de Mutation.

Console
  1. Inicie sesión en la AWS Management Console y abra la consola de AppSync.

    1. En el panel de API, seleccione su API de GraphQL.

    2. En la barra lateral, seleccione Esquema.

  2. En el tipo de Mutación, seleccione Asociar junto al campo addTodo.

  3. En la página Crear un solucionador, elija el origen de datos que creó en la guía Asociar un origen de datos.

  4. En la ventana Configurar plantillas de asignación, modifique la plantilla de solicitud, ya que se trata de una mutación en la que se añade un elemento nuevo a DynamoDB. Use la siguiente plantilla de asignación de solicitud.

    { "version" : "2017-02-28", "operation" : "PutItem", "key" : { "id" : $util.dynamodb.toDynamoDBJson($ctx.args.id) }, "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args) }
  5. AWS AppSync transforma automáticamente los argumentos definidos en el campo addTodo desde su esquema de GraphQL en operaciones de DynamoDB. En el ejemplo anterior se almacenan registros en DynamoDB mediante una clave de id, que se transfiere desde el argumento de mutación como $ctx.args.id. Todos los demás campos que transfiera se mapearán automáticamente en atributos de DynamoDB con $util.dynamodb.toMapValuesJson($ctx.args).

    Para este solucionador, use la siguiente plantilla de mapeo de respuesta:

    $util.toJson($ctx.result)

    AWS AppSync también es compatible con los flujos de trabajo de prueba y depuración para editar los solucionadores. Puede usar un objeto context simulado para ver el valor transformado de la plantilla antes de la invocación. De forma opcional, puede ver la ejecución de la solicitud completa en un origen de datos de forma interactiva cuando ejecute una consulta. Para obtener más información, consulte las secciones sobre prueba y depuración de solucionadores y sobre monitorización y registro.

  6. Seleccione Guardar solucionador.

API

También puede hacer esto con las API mediante los comandos de la sección Cree su primer solucionador y los detalles de los parámetros de esta sección.

CLI

También puede hacer esto en la CLI utilizando los comandos de la sección Cree su primer solucionador y los detalles de los parámetros de esta sección.

En este momento, si no usa los solucionadores avanzados, puede empezar a utilizar su API de GraphQL tal como se indica en Uso de la API.

Solucionadores avanzados

Si está siguiendo la sección avanzada y crea un esquema de ejemplo en Diseño del esquema para realizar un análisis paginado, utilice la siguiente plantilla de solicitud para el campo getTodos:

{ "version" : "2017-02-28", "operation" : "Scan", "limit": $util.defaultIfNull(${ctx.args.limit}, 20), "nextToken": $util.toJson($util.defaultIfNullOrBlank($ctx.args.nextToken, null)) }

En este caso de uso de paginación el mapeo de la respuesta es algo más que un acceso directo, ya que debe contener tanto el cursor (de modo que el cliente sepa en qué página comenzar a continuación) como el conjunto de resultados. La plantilla de mapeo es la siguiente:

{ "todos": $util.toJson($context.result.items), "nextToken": $util.toJson($context.result.nextToken) }

Los campos de la plantilla de mapeo de respuesta anterior tienen que coincidir con los campos definidos en su tipo TodoConnection.

En el caso de las relaciones en las que tiene una tabla Comments y usted está solucionando el campo de comentarios del tipo Todo (que devuelve un tipo de [Comment]), puede utilizar una plantilla de asignación que ejecute una consulta en la segunda tabla. Para ello, ya debe haber creado un origen de datos para la tabla Comments tal como se indica en Asociar un origen de datos.

nota

Usamos una operación de consulta en otra tabla solo con fines ilustrativos. También podría usar otra operación realizada en DynamoDB en su lugar. Además, podría extraer los datos de otro origen de datos, como, por ejemplo AWS Lambda o Amazon OpenSearch Service, ya que el esquema de GraphQL controla la relación.

Console
  1. Inicie sesión en la AWS Management Console y abra la consola de AppSync.

    1. En el panel de API, seleccione su API de GraphQL.

    2. En la barra lateral, seleccione Esquema.

  2. En el tipo Todo, seleccione Asociar junto al campo comments.

  3. En la página Crear solucionador, elija el origen de datos de la tabla Comentarios. El nombre predeterminado de la tabla Comentarios en las guías de inicio rápido es AppSyncCommentTable, pero puede variar en función del nombre que le haya dado.

  4. Añada el siguiente fragmento de código a su plantilla de asignación de solicitud:

    { "version": "2017-02-28", "operation": "Query", "index": "todoid-index", "query": { "expression": "todoid = :todoid", "expressionValues": { ":todoid": { "S": $util.toJson($context.source.id) } } } }
  5. context.source hace referencia al objeto principal del campo actual que se está resolviendo. En este ejemplo, source.id hace referencia al objeto Todo individual, que se usa a continuación para la expresión de consulta.

    Puede utilizar la plantilla de mapeo de respuesta de acceso directo de la siguiente manera:

    $util.toJson($ctx.result.items)
  6. Seleccione Guardar solucionador.

  7. Por último, en la página Esquema, asocie un solucionador al campo addComment y especifique el origen de datos para la tabla Comments. La plantilla de mapeo de solicitud en este caso es un elemento PutItem sencillo con el elemento todoid específico en el que se realiza el comentario como argumento, pero usa la utilidad $utils.autoId() para crear una clave de ordenación única para el comentario de la siguiente manera:

    { "version": "2017-02-28", "operation": "PutItem", "key": { "todoid": { "S": $util.toJson($context.arguments.todoid) }, "commentid": { "S": "$util.autoId()" } }, "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args) }

    Utilice una plantilla de respuesta de acceso directo de la siguiente manera:

    $util.toJson($ctx.result)
API

También puede hacer esto con las API mediante los comandos de la sección Cree su primer solucionador y los detalles de los parámetros de esta sección.

CLI

También puede hacer esto en la CLI utilizando los comandos de la sección Cree su primer solucionador y los detalles de los parámetros de esta sección.