> For the complete documentation index, see [llms.txt](https://abi.gitbook.io/net-core/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://abi.gitbook.io/net-core/6.3-agregar-graphql.md).

# 8. GraphQL

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 uno para web y otro para la app, se crea un servicio Graph para traer solamente la información que se necesita.

De momento no cuenta con librería oficial por parte de Microsoft. Hay 2 paquetes de Graphql Hotchocolate y grapqhl for .net. El que esta teniendo mas popularidad es Hotchocolate.

La estructura de GraphQL esta formada por 3 partes:

1. Operación
2. Tabla y/o datos
3. Campos de la tabla

![](/files/-LasENUgdISWGtPMg7dY)

GraphQL se basa en enviar las peticiones por medio de consultas, se tienen 3 tipos:

1. **Query**: Para consultar información
2. **Mutation**: Para modificar información (crear, borrar, modificar)
3. **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:

```graphql
http://myapi/graphql?query={clientes{clave, nombre}}
```

Esta petición genera el siguiente resultado

```javascript
{
  "data": {
    "clientes": [
      {gr
        "Clave": 1,
        "Nombre": "John Doe"
      },
      {
        "Clave": "2",
        "Nombre": "Alicia Smith"
      }
    ]
  }
}
```

### &#x20;Agregar  paquetes Nuget para habilitar graphQL en .NET Core

Vamos a agregar los siguientes paquetes Nuget para habilitar GraphQL en nuestro proyecto

```
Install-Package HotChocolate.AspNetCore
Install-Package HotChocolate.Data.EntityFramework
```

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 están disponibles para el servicio, los tipos de datos comunes de .net como int, string tienen su equivalente para graphQL
* **Query:** Permite configurar nuestro objeto GraphType (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) y Suscripción (Operaciones con WebSockets).

![](/files/-Let_ax4yOdAIOqgiy-a)

Vamos a crear nuestra tabla caducidad la cual contendrá los datos del cliente y del producto para realizar la consulta de la siguiente manera:

```graphql
{
    "query": "query {
		caducidades {
			id
			producto {
				id
				clave
				nombre
			}
			cliente
			{
				id
				nombreComercial
			}			
	      }	
   }"
} 
```

Este método se podrá consultar por GET o por POST, es mas cómodo realizarlo por POST.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://abi.gitbook.io/net-core/6.3-agregar-graphql.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
