Guia Definitivo: Controllers no ASP.NET Core Eficientes
Aprenda REST: Guia Completo para Desenvolver APIs Escaláveis
Imagine que você tem um serviçoCriando e Escalando Serviços no Docker SwarmDescubra como criar, gerenciar e escalar serviços no Docker Swarm, utilizando comandos simples para manter alta disponibilidade em seu cluster. de entrega de pizza e precisa oferecer um jeito fácil de clientes e parceiros acessarem informações sobre pedidos, status e cardápio. É aí que entra o conceito de REST: uma abordagem para criar APIs que sejam simples, padronizadas e escaláveis. Mesmo que você não seja especialista em desenvolvimento web, entender os princípios RESTful pode elevar a qualidade de qualquer API que você construir - seja para um app mobile, um front-end web ou serviços
Criando e Escalando Serviços no Docker SwarmDescubra como criar, gerenciar e escalar serviços no Docker Swarm, utilizando comandos simples para manter alta disponibilidade em seu cluster. internos.
Abaixo, você encontrará uma visão aprofundada dos principais fundamentos do REST, tudo explicado com exemplos do mundo real para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! que você possa se sentir cada vez mais confortável em desenhar e consumir APIs.
Tabela de Conteúdo🔗
1. O que é REST e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. por que isso importa?
2. Principais Conceitos: Recursos, Representações e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. Stateless
3. Métodos HTTP📄 Swagger/OpenAPI: Documente sua API Automaticamente!Descubra como gerar documentação interativa e automatizada em APIs com o Swagger/OpenAPI. Aprenda a configurar no .NET e testar endpoints facilmente. e Suas Aplicações
4. Boas Práticas de Nomeação🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)Descubra como as variáveis em C# funcionam, com exemplos do mundo real, boas práticas de nomeação e dicas para otimizar seu código. de Endpoints
5. Status Codes: Informe o que Está Acontecendo!
6. HATEOAS e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. Navegação de Recursos
7. Cache e Escalabilidade🚀 Scale Out com Redis: Atenda Milhões de Conexões!Integre o Redis com SignalR no .NET e distribua mensagens entre servidores, alcançando escalabilidade e alta performance em tempo real.
O que é REST e por que isso importa?🔗
REST (Representational State Transfer) é um estilo de arquitetura para construção de serviçosCriando e Escalando Serviços no Docker SwarmDescubra como criar, gerenciar e escalar serviços no Docker Swarm, utilizando comandos simples para manter alta disponibilidade em seu cluster. web, popularmente conhecido por permitir a criação de APIs
🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real. simples e escaláveis. Ele define um conjunto de restrições que deixam cada requisição independente das outras (stateless), além de padronizar o uso de métodos HTTP
📄 Swagger/OpenAPI: Documente sua API Automaticamente!Descubra como gerar documentação interativa e automatizada em APIs com o Swagger/OpenAPI. Aprenda a configurar no .NET e testar endpoints facilmente. para diferentes tipos de operações.
Por que se preocupar com REST?
- Simplicidade: Facilita a compreensão do que cada endpoint faz.
- Escalabilidade
🚀 Scale Out com Redis: Atenda Milhões de Conexões!Integre o Redis com SignalR no .NET e distribua mensagens entre servidores, alcançando escalabilidade e alta performance em tempo real.: Cada parte do sistema pode ser organizada e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. mantida separadamente.
- Interoperabilidade: Fica mais fácil integrar diferentes serviços
Criando e Escalando Serviços no Docker SwarmDescubra como criar, gerenciar e escalar serviços no Docker Swarm, utilizando comandos simples para manter alta disponibilidade em seu cluster. ou aplicações externas, pois todos falam uma “linguagem” em comum.
Principais Conceitos: Recursos, Representações e Stateless🔗
Para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! entender REST, precisamos conversar sobre três conceitos fundamentais:
1. Recursos:
Um recurso representa algo do mundo real. Pode ser um pedido de pizza, um usuário ou um produto🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!Aprenda a dominar operadores aritméticos em C# com exemplos práticos, técnicas de cálculo e dicas para evitar erros e maximizar resultados..
- Exemplo: “O recurso pedido representa qualquer solicitação de pizza no meu sistema.”
2. Representações:
É o formato em que o recurso é apresentado ou enviado. Geralmente se utiliza JSON, XML🖌️ XAML Básico: Crie Interfaces sem Código C# (Quase)!Descubra como usar XAML para criar interfaces atrativas em aplicações .NET. Aprenda conceitos e dicas práticas para iniciar seu projeto. ou HTML.
- Exemplo: “Se tenho um recurso pedido, a representação JSON dele pode incluir campos como id, tamanhoDaPizza, tempoDeEntrega, etc.”
3. Stateless:
Significa que cada requisição ao servidor deve conter todas as informações necessárias para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! que o servidor a atenda. O servidor não depende de um estado anterior para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! processar a próxima requisição.
- Exemplo: “Se você manda um
GET
para buscar o pedido, essa requisição deve conter a autorização⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. /pedidos/123
🛡️ Segurança em SignalR: Autenticação e Autorização!Descubra como implementar JWT e autorização com roles e claims no SignalR, garantindo segurança e controle de acessos em tempo real. ou quaisquer dados adicionais que o servidor precise, sem depender de chamada anterior.”
Métodos HTTP e Suas Aplicações🔗
Um dos pilares do REST é usar de forma apropriada os métodos🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. (ou verbos) HTTP para cada tipo de ação:
Verbo | Quando Usar | Exemplo |
---|---|---|
GET | Obter informação de um recurso | GET /pizzas -> lista de pizzas |
POST | Criar um novo recurso | POST /pizzas -> cria pizza nova |
PUT | Atualizar (ou substituir) um recurso existente | PUT /pizzas/123 -> substitui dados da pizza id=123 |
PATCH | Atualização parcial de um recurso | PATCH /pizzas/123 -> atualiza somente alguns campos |
DELETE | Remover um recurso | DELETE /pizzas/123 -> remove a pizza com id=123 |
Esses são os métodos🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. mais comuns e cobrem a maior parte das interações em uma API. Uma dica importante é não abusar do GET
⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! criar ou atualizar recursos, pois isso fere os princípios REST e pode gerar confusões.
Boas Práticas de Nomeação de Endpoints🔗
Manter os endpoints📄 Swagger/OpenAPI: Documente sua API Automaticamente!Descubra como gerar documentação interativa e automatizada em APIs com o Swagger/OpenAPI. Aprenda a configurar no .NET e testar endpoints facilmente. simples e com substantivos no plural deixa o uso da API mais intuitivo:
- Use substantivos:
/pedidos
,/clientes
,/produtos
.🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio.
- Mantenha plural (se fizer sentido):
/pedidos
em vez de/pedido
. - Evite verbos no caminho: nada de
/getAllPedidos
, pois isso já está implícito noGET
.⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. /pedidos
GET /pedidos // Retorna todos os pedidos
GET /pedidos/1 // Retorna o pedido de ID 1
POST /pedidos // Cria um novo pedido
PUT /pedidos/1 // Atualiza todo o pedido ID 1
DELETE /pedidos/1 // Exclui pedido ID 1
Status Codes: Informe o que Está Acontecendo!🔗
Uma parte essencial é informar ao cliente o resultado de cada requisição. Para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! isso, utilizamos status codes:
- 200 OK: Resposta de sucesso em geral (GET
⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção., PATCH, PUT).
- 201 Created: Usado quando
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. algo novo foi criado (em um
POST
). - 204 No Content: Sucesso, mas
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. sem conteúdo no corpo da resposta (geralmente usado em
DELETE
).📝 SQL Básico: SELECT, INSERT, UPDATE e DELETE para Sobreviver!Aprenda os comandos cruciais de SQL para manipular dados em bancos relacionais com exemplos práticos, dicas e boas práticas para livrarias.
- 400 Bad Request: Quando
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. existe algo errado na requisição (ex.: dados inválidos).
- 404 Not Found: Recurso não encontrado.
- 500 Internal Server Error: Algo deu errado no servidor (evite expor detalhes ao cliente).
Muita gente ignora status codes e retorna tudo como 200, mas isso faz perder toda a semântica HTTP. Use status codes adequados para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! facilitar o debug e a usabilidade da API.
HATEOAS e Navegação de Recursos🔗
HATEOAS (Hypermedia as the Engine of Application State) é uma proposta que vai além de simplesmente devolver dados. Significa que sua resposta pode conter links para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! navegar pelos recursos da API. Um exemplo simples em JSON:
{
"id": 1,
"nome": "Pizza de Calabresa",
"links": [
{
"rel": "self",
"href": "https://minhaapi.com/pizzas/1"
},
{
"rel": "todas-as-pizzas",
"href": "https://minhaapi.com/pizzas"
}
]
}
Com isso, o cliente pode descobrir, a partir de um pedido ou produto🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!Aprenda a dominar operadores aritméticos em C# com exemplos práticos, técnicas de cálculo e dicas para evitar erros e maximizar resultados., quais operações são possíveis em seguida. Não é obrigatório em toda API, mas eleva o nível de discoverability e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. facilita evoluções sem quebrar clientes já existentes.
Cache e Escalabilidade🔗
Uma das restrições do REST é que as respostas devem ser cacheáveis (ou explicitamente definidas como não-cacheáveis). Isso ajuda a reduzir a carga nos servidores e melhorar a performance🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!Descubra como o StringBuilder otimiza a concatenação em C#, evitando desperdício de memória e melhorando a performance das aplicações. Veja exemplos práticos! para o cliente. Alguns pontos importantes:
- Cache
Boas Práticas com Caching e Resultados Pré-CalculadosAprenda a implementar técnicas de caching e resultados pré-calculados para acelerar consultas, otimizar recursos e melhorar a performance da sua aplicação.-Control: Configure cabeçalhos para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! indicar se a resposta pode ou não ser cacheada, e por quanto tempo.
- ETags: Auxiliam a identificar se um recurso foi alterado desde a última vez que o cliente fez a requisição.
Com um bom uso de cachingBoas Práticas com Caching e Resultados Pré-CalculadosAprenda a implementar técnicas de caching e resultados pré-calculados para acelerar consultas, otimizar recursos e melhorar a performance da sua aplicação., a API lida melhor com tráfego intenso e garante menor latência nas requisições.
Os 6 Mandamentos RESTful🔗
Client-Server
Separação clara de responsabilidades:
- Client: UI/UX (frontend)
- Server: Lógica de negócio/dados (backend)
Exemplo:
// Controller ASP.NET Core
[ApiController]
[Route("api/[controller]")]
public class CarrinhoController : ControllerBase
{
private readonly ICarrinhoService _service;
// Injeção de dependência
public CarrinhoController(ICarrinhoService service)
{
_service = service;
}
[HttpGet("{id}")]
public ActionResult<CarrinhoDto> Get(int id)
{
var carrinho = _service.ObterCarrinho(id);
return Ok(carrinho);
}
}
Stateless
Cada request deve conter TODAS as informações necessárias. O server não guarda estado entre requests.
Cenário real:
- Login
🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!Aprenda a criar um sistema de login robusto em C#, com tratamento de erros adequado, validação e segurança para evitar vulnerabilidades. tradicional (stateful) vs. JWT (stateless)
- Session ID no cookie vs
🛠️ Instalação do Visual Studio: Prepare sua Nave para Decolar!Prepare seu ambiente de desenvolvimento com o Visual Studio em uma aventura C#. Este tutorial prático ensina a instalar, configurar e personalizar sua IDE.. Token no header
Cacheable
Vantagens:
- Reduz latência
- Diminui carga no servidor
- Melhora experiência
🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!Aprenda a otimizar seu perfil LinkedIn com dicas essenciais para devs .NET. Conquiste oportunidades e destaque suas habilidades! do usuário
Uniform Interface
4.1 Identificação de recursos
/clientes/54321
vs /getUser?id=54321
4.2 Representações
// Content Negotiation
[HttpGet("{id}")]
[Produces("application/json", "application/xml")]
public IActionResult GetCliente(int id)
{
var cliente = _repo.GetCliente(id);
return Ok(cliente);
}
4.3 Mensagens auto-descritivas
DELETE /pedidos/789 HTTP/1.1
Authorization: Bearer xyz
Accept: application/json
HTTP/1.1 204 No Content
4.4 HATEOAS
{
"id": 123,
"total": 299.90,
"_links": {
"self": { "href": "/pedidos/123" },
"pagamento": { "href": "/pedidos/123/pagamento" }
}
}
Layered System
Exemplo de arquitetura:
1. Load Balancer
2. Web Server
3. Application Server
4. Database
Code-On-Demand (Opcional)
// Exemplo: API retornando script personalizado
{
"script": "function atualizarUI() { ... }"
}
Boas Práticas para APIs Profissionais🔗
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]")]
2. Documentação
services.AddSwaggerGen(c => {
c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
});
3. Status Codes Corretos
| Código | Significado | Método HTTP | |--------|---------------------------|-------------| | 200 | OK | GET | | 201 | Created | POST | | 204 | No Content | DELETE | | 400 | Bad Request | Qualquer | | 401 | Unauthorized | Qualquer | | 404 | Not Found | Qualquer |
[HttpGet]
public ActionResult<PagedList<ProdutoDto>> GetProdutos(
[FromQuery] PaginacaoParams parametros)
{
var query = _context.Produtos.AsQueryable();
var pagedList = PagedList<ProdutoDto>.Create(query, parametros);
return Ok(pagedList);
}
Exemplo Prático: API de Biblioteca🔗
[HttpGet("{id}", Name = "GetLivro")]
[ProducesResponseType(200)]
[ProducesResponseType(404)]
public async Task<ActionResult<LivroDetalhadoDto>> GetLivro(int id)
{
var livro = await _context.Livros
.Include(l => l.Autor)
.FirstOrDefaultAsync(l => l.Id == id);
if (livro == null)
{
return NotFound(new { Mensagem = "Livro não encontrado" });
}
var livroDto = _mapper.Map<LivroDetalhadoDto>(livro);
livroDto.Links.Add(new LinkDto("emprestar", Url.Link("PostEmprestimo", null)));
return Ok(livroDto);
}
Teste com HttpClient:
[Fact]
public async Task GetLivro_Existente_Retorna200ComDados()
{
// Arrange
var client = _factory.CreateClient();
var livroId = 1;
// Act
var response = await client.GetAsync($"/api/livros/{livroId}");
// Assert
response.EnsureSuccessStatusCode();
var livro = await response.Content.ReadFromJsonAsync<LivroDto>();
Assert.NotNull(livro);
Assert.Equal(livroId, livro.Id);
}
Conclusão🔗
Dominar REST não é só decorar verbos HTTP📄 Swagger/OpenAPI: Documente sua API Automaticamente!Descubra como gerar documentação interativa e automatizada em APIs com o Swagger/OpenAPI. Aprenda a configurar no .NET e testar endpoints facilmente. - é entender como e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. por que essas decisões arquiteturais foram tomadas. Ao implementar os 6 princípios:
Lembre-se: REST é uma filosofia, não uma implementação específica. Quanto mais seus endpoints📄 Swagger/OpenAPI: Documente sua API Automaticamente!Descubra como gerar documentação interativa e automatizada em APIs com o Swagger/OpenAPI. Aprenda a configurar no .NET e testar endpoints facilmente. seguirem esses princípios, mais eles se comportarão como a web espera que se comportem!
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.
Referências🔗
- .NET Documentation: learn.microsoft.com/pt-br/dotnet/
- Awesome .NET: github.com/quozd/awesome-dotnet
- C# Language Specification: learn.microsoft.com/pt-br/dotnet/csharp/language-reference/language-specification/
- GitHub: Microsoft/.NET: github.com/dotnet
- Microsoft Learn: C# e .NET: learn.microsoft.com/pt-br/dotnet/csharp/