Introdução: API não é assustador, é muito conveniente
\n\nImagine que você está pedindo uma pizza. Você liga para o restaurante, dita o endereço e os ingredientes — e em 30 minutos o entregador está na porta. A API na programação funciona exatamente da mesma forma: é aquele "telefonema" através do qual um programa se comunica com outro. Só que em vez de voz, são requisições HTTP, e em vez de pizza, são dados.
\n\nNo mundo do desenvolvimento em C#, API é a base. Qualquer projeto moderno, seja uma aplicação web, um backend mobile ou um serviço corporativo, de uma forma ou de outra "aciona" serviços externos. E aí surge a questão principal: qual protocolo escolher? REST, GraphQL ou gRPC? Cada um é bom à sua maneira, mas cada um é para a sua tarefa.
\n\nNeste artigo, vamos abordar o trabalho com API em C# com exemplos reais. Você aprenderá como enviar requisições HTTP, como integrar C# com GraphQL e gRPC e, principalmente, entenderá quando usar cada um. Vamos lá!
\n\n\n\n
1. API REST em C#: o clássico que nunca envelhece
\n\nREST (Representational State Transfer) é um estilo arquitetural que há muitos anos continua sendo o padrão de facto. Simples, intuitivo, funciona sobre HTTP. Se você já escreveu código que envia requisições GET ou POST — já trabalhou com REST.
\n\nComo enviar requisições REST em C#
\n\nEm C#, para trabalhar com REST, geralmente se usa a classe HttpClient. Ela está embutida no .NET e faz de tudo: desde requisições GET simples até POST complexos com corpo JSON.
Aqui está como se parece uma requisição típica para uma API REST em C#:
\n\nusing 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\nCurto e claro. O HttpClient tem uma vida longa, por isso geralmente é criado uma vez e reutilizado (em projetos reais, através de um contêiner DI).
Quando o REST é a sua escolha
\n- \n
- Você está criando uma API pública para web ou aplicativos mobile. \n
- Os clientes são navegadores, dispositivos móveis, IoT. \n
- Você precisa de simplicidade e cache no nível HTTP. \n
Desvantagens do REST: redundância de dados (muitas vezes chega mais do que o necessário) e o problema das requisições N+1, quando para obter dados relacionados é necessário fazer várias chamadas.
\n\n\n\n
2. GraphQL em C#: solicite apenas o que precisa
\n\nGraphQL é uma linguagem de consulta criada pelo Facebook. Sua principal característica: o próprio cliente decide quais campos precisa. Nenhuma informação extra, nenhuma dezena de endpoints — uma consulta, uma resposta.
\n\nEnviando uma consulta GraphQL a partir do C#
\n\nPara trabalhar com GraphQL em C#, você pode usar o HttpClient diretamente, mas é mais conveniente usar a biblioteca GraphQL.Client (pacote NuGet GraphQL.Client).
Exemplo de consulta a uma API GraphQL:
\n\nusing 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