GraphQL API con C#: tutorial práctico paso a paso
En el desarrollo web moderno, GraphQL se está convirtiendo en una alternativa cada vez más popular a REST API. A diferencia de REST, donde cada endpoint devuelve una estructura de datos fija, GraphQL permite al cliente solicitar exactamente los datos que necesita. En este tutorial crearemos un GraphQL API completo en C# (.NET) utilizando la biblioteca Hot Chocolate. Aprenderá cómo configurar el servidor, definir tipos de datos, implementar consultas y mutaciones, así como agregar suscripciones para actualizaciones en tiempo real.
¿Qué es GraphQL y por qué usarlo con C#?
GraphQL es un lenguaje de consulta para API, desarrollado por Facebook. Las principales ventajas son:
- Flexibilidad de consultas — el cliente decide qué campos obtener
- Punto de entrada único — un endpoint para todas las consultas
- Tipado fuerte — todos los tipos de datos están estrictamente definidos
- Sin over-fetching ni under-fetching — obtiene exactamente lo que solicitó
En el ecosistema .NET, la mejor biblioteca para implementar GraphQL es Hot Chocolate. Soporta todas las capacidades de la especificación GraphQL, incluyendo consultas (queries), mutaciones (mutations) y suscripciones (subscriptions).
Preparación del proyecto e instalación de dependencias
Comencemos creando un nuevo proyecto ASP.NET Core. Abra la terminal o línea de comandos y ejecute:
dotnet new webapi -n GraphQLDemocd GraphQLDemoAhora instalemos el paquete Hot Chocolate:
dotnet add package HotChocolate.AspNetCoredotnet add package HotChocolate.AspNetCore.PlaygroundCreemos el modelo de datos para nuestra API. Supongamos que trabajaremos con libros y autores. Cree la carpeta Models y agregue las clases:
// Models/Author.cspublic class Author{ public int Id { get; set; } public string Name { get; set; } public ICollection<Book> Books { get; set; }}
// Models/Book.cspublic class Book{ public int Id { get; set; } public string Title { get; set; } public int AuthorId { get; set; } public Author Author { get; set; }}Creación del esquema GraphQL y resolvers
En GraphQL, los componentes clave son tipos, consultas (Query) y mutaciones (Mutation). Creemos la carpeta GraphQL y agreguemos los archivos:
// GraphQL/Query.cspublic class Query{ public IQueryable<Book> GetBooks([Service] ApplicationDbContext context) { return context.Books.Include(b => b.Author); }
public Book GetBook(int id, [Service] ApplicationDbContext context) { return context.Books.Include(b => b.Author).FirstOrDefault(b => b.Id == id); }
public IQueryable<Author> GetAuthors([Service] ApplicationDbContext context) { return context.Authors.Include(a => a.Books); }}
// GraphQL/Mutation.cspublic class Mutation{ public async Task<Book> AddBook(string title, int authorId, [Service] ApplicationDbContext context) { var book = new Book { Title = title, AuthorId = authorId }; context.Books.Add(book); await context.SaveChangesAsync(); return book; }
public async Task<Author> AddAuthor(string name, [Service] ApplicationDbContext context) { var author = new Author { Name = name }; context.Authors.Add(author); await context.SaveChangesAsync(); return author; }}Ahora registremos estas clases en Program.cs:
// Program.csvar builder = WebApplication.CreateBuilder(args);
builder.Services .AddDbContext<ApplicationDbContext>(options => options.U