API em C#: REST, GraphQL e gRPC — como escolher e não se arrepender

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: API não é assustador, é muito conveniente

\n\n

Imagine 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\n

No 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\n

Neste 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\n

REST (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\n

Como enviar requisições REST em C#

\n\n

Em 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.

\n\n

Aqui está como se parece uma requisição típica para uma API REST em 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

Curto 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).

\n\n

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
\n\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\n

GraphQL é 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\n

Enviando uma consulta GraphQL a partir do C#

\n\n

Para trabalhar com GraphQL em C#, você pode usar o HttpClient diretamente, mas é mais conveniente usar a biblioteca GraphQL.Client (pacote NuGet GraphQL.Client).

\n\n

Exemplo de consulta a uma 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