Guia Definitivo: Controllers no ASP.NET Core Eficientes
Aprenda REST: Guia Completo para Desenvolver APIs Escaláveis
Imagine que você tem um serviço de entrega de pizza e precisa oferecer um jeito fácil de clientes e parceiros acessarem informações sobre pedidos, status 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. 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
🔄 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! um app mobile, um front-end web ou serviços 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🔄 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! construção de serviços 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 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-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 caching, a API🌍 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. 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 |4. Paginação
[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/