API en C#: REST, GraphQL y gRPC — cómo elegir y no arrepentirse

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: las API no dan miedo, son muy útiles

\n\n

Imagine que pide una pizza. Llama al restaurante, dicta la dirección y los ingredientes, y en 30 minutos el repartidor está en la puerta. Una API en programación funciona exactamente igual: es esa «llamada telefónica» mediante la cual un programa se comunica con otro. Solo que en lugar de voz, hay solicitudes HTTP, y en lugar de pizza, datos.

\n\n

En el mundo del desarrollo en C#, las API son la base. Cualquier proyecto moderno, ya sea una aplicación web, un backend móvil o un servicio corporativo, de una forma u otra «consume» servicios externos. Y aquí surge la pregunta principal: ¿qué protocolo elegir? ¿REST, GraphQL o gRPC? Cada uno es bueno a su manera, pero cada uno para su tarea.

\n\n

En este artículo analizaremos el trabajo con API en C# con ejemplos reales. Aprenderá a enviar solicitudes HTTP, cómo integrar C# con GraphQL y gRPC, y, lo más importante, comprenderá cuándo usar cada uno. ¡Allá vamos!

\n\n
\n\n

1. API REST en C#: un clásico que nunca pasa de moda

\n\n

REST (Transferencia de Estado Representacional) es un estilo arquitectónico que durante muchos años sigue siendo el estándar de facto. Simple, comprensible, funciona sobre HTTP. Si alguna vez ha escrito código que envía solicitudes GET o POST, ya ha trabajado con REST.

\n\n

Cómo enviar solicitudes REST en C#

\n\n

En C#, para trabajar con REST se usa principalmente la clase HttpClient. Está integrada en .NET y puede hacer de todo: desde simples solicitudes GET hasta complejas solicitudes POST con cuerpo JSON.

\n\n

Así es como se ve una solicitud típica a una API REST en C#:

\n\n
using System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\nclass Program\n{\n    static async Task Main(string[] args)\n    {\n        using HttpClient client = new HttpClient();\n        client.BaseAddress = new Uri("https://api.example.com/");\n        \n        HttpResponseMessage response = await client.GetAsync("users/1");\n        if (response.IsSuccessStatusCode)\n        {\n            string json = await response.Content.ReadAsStringAsync();\n            Console.WriteLine(json);\n        }\n    }\n}\n
\n\n

Breve y claro. HttpClient tiene una larga vida útil, por lo que normalmente se crea una vez y se reutiliza (en proyectos reales, a través del contenedor DI).

\n\n

Cuándo elegir REST

\n
    \n
  • Está escribiendo una API pública para web o aplicaciones móviles.
  • \n
  • Los clientes son navegadores, dispositivos móviles, IoT.
  • \n
  • Necesita simplicidad y almacenamiento en caché a nivel HTTP.
  • \n
\n\n

Desventajas de REST: redundancia de datos (a menudo llega más de lo necesario) y el problema de las consultas N+1, donde para obtener datos relacionados es necesario realizar varias llamadas.

\n\n
\n\n

2. GraphQL en C#: solicita solo lo que necesitas

\n\n

GraphQL es un lenguaje de consulta creado por Facebook. Su principal característica: el cliente decide qué campos necesita. Sin información superflua, sin decenas de endpoints: una sola consulta, una sola respuesta.

\n\n

Envío de una consulta GraphQL desde C#

\n\n

Para trabajar con GraphQL en C#, se puede usar HttpClient directamente, pero es más conveniente usar la biblioteca GraphQL.Client (paquete NuGet GraphQL.Client).

\n\n

Ejemplo de consulta a una API GraphQL:

\n\n
using System;\nusing System.Threading.Tasks;\nusing GraphQL;\nusing GraphQL.Client.Http;\nusing GraphQL.Client.Serializer.Newtonsoft;\n\nclass Program\n{\n    static async Task Main(string[] args)\n    {\n        using var client = new GraphQLHttpClient("https://api.example.com/graphql", new NewtonsoftJsonSerializer());\n\n        var request = new GraphQLRequest\n        {\n            Query = @"\n            {\n                user(id: 1) {\n                    name\n                    email\n                    posts {\n                        title\n                    }\n                }\n            }"\n        };\n\n        var response = await client.SendQueryAsync<dynamic                

Blogs

Book Recommendations