GraphQL fue desarrollado por Facebook para facilitar la consulta de información, por ejemplo una aplicación para celulares suele contener menos información que una aplicación web, por lo cual en lugar de crear 2 servicios, se crea un servicio para traer solamente la información que se necesita.
De momento no cuenta con librería oficial por parte de Microsoft. El paquete nuget requerido es GraphQL de Joe McBride
La estructura de GraphQL esta formada por 3 partes
Operación
Tabla y/o datos
Campos de la tabla
GraphQL se basa en enviar las peticiones por medio de consultas, se tienen 3 tipos:
Query: Para consultar información
Mutation: Para modificar información (crear, borrar, modificar)
Subscription: Para WebSockets (con WebSockets puedes por ejemplo recibir notificaciones cuando ocurre algún evento)
Un ejemplo para obtener la clave y nombre de los clientes sería el siguiente:
http://myapi/graphql?query={clientes{clave, nombre}}
Esta petición genera el siguiente resultado
{"data": {"clientes": [{"Clave": 1,"Nombre": "John Doe"},{"Clave": "2","Nombre": "Alicia Smith"}]}}
Vamos a agregar los siguientes paquetes Nuget para habilitar GraphQL en nuestro proyecto
Install-Package GraphQLInstall-Package GraphQL.Server.Transports.AspnetCoreInstall-Package GraphQL.Server.Transports.AspNetCore.SystemTextJson
Para poder probar los servicios podemos utilizar el siguiente paquete el cual es similar a Swagger ya que nos genera la documentación y nos ayuda a probar nuestros servicios
Install-Package GraphQL.Server.UI.Playground
La estructura básica es la siguiente:
GraphType: Permite indicar los campos del modelo que estan disponibles para el servicio, los tipos de datos comunes de .net como int, string tienen su equivalente para graphQL
Query: Permite configurar nuestro objetoGraphType(Modelo) con nuestra base de datos para llenar los campos del modelo.
Schema: Nos permite definir las operaciones a realizar: Query( Consulta información), Mutation: (Crear, Borrar, Modificar), Suscripción(Operaciones con WebSockets).
Vamos a crear nuestra tabla caducidad la cual contendrá los datos del cliente y del producto para realizar la consulta de la siguiente manera:
{"query": "query {caducidades {idproducto {idclavenombre}cliente{idnombreComercial}}}"}
Este método se podrá consultar por GET o por POST, es mas cómodo realizarlo por POST.