Módulo 4 · APIs e sua Arquitetura — Capítulo 01

REST — Princípios e Verbos HTTP

Os princípios que fazem uma API "fazer sentido" para quem a consome pela primeira vez — recursos, verbos HTTP e códigos de status usados com propósito.

1. REST não é um framework, é um conjunto de convenções

REST (Representational State Transfer) é um estilo de arquitetura — um conjunto de convenções sobre como modelar operações como URLs + verbos HTTP, não uma biblioteca ou tecnologia específica. Você já consumiu APIs REST em Node/Express; os mesmos princípios se aplicam aqui, só muda a linguagem que os implementa.

2. Recursos, não ações, nas URLs

A ideia central: a URL identifica um recurso (um substantivo — clientes, pedidos), e o verbo HTTP diz o que fazer com ele. Ações não deveriam aparecer na URL.

Evite (ação na URL)Prefira (recurso + verbo)
GET /obterCliente?id=42GET /clientes/42
POST /criarClientePOST /clientes
POST /excluirCliente/42DELETE /clientes/42
POST /listarClientesAtivosGET /clientes?ativo=true

3. Os verbos HTTP e seu significado

VerboPapelIdempotente?Equivalente no Módulo 2
GETLer um recurso, sem efeitos colateraisSimusp_ClienteObter / usp_ClienteListar
POSTCriar um novo recursoNãousp_ClienteInserir
PUTSubstituir um recurso inteiroSimusp_ClienteAtualizar (substituindo todos os campos)
PATCHAtualizar parcialmente um recursoNão necessariamenteUma variação de update que só altera campos enviados
DELETERemover um recursoSimusp_ClienteExcluir
O que significa "idempotente"

Uma operação é idempotente se chamá-la uma vez ou várias vezes seguidas produz o mesmo resultado final. DELETE /clientes/42 chamado duas vezes ainda deixa o cliente 42 excluído (a segunda chamada só devolve 404). Já POST /clientes chamado duas vezes cria dois clientes — por isso não é idempotente.

4. Códigos de status HTTP com propósito

CódigoSignificadoQuando usar
200 OKSucesso genéricoGET, PUT, PATCH bem-sucedidos
201 CreatedRecurso criadoPOST bem-sucedido — inclui o header Location apontando para o novo recurso
204 No ContentSucesso, sem corpo de respostaDELETE bem-sucedido
400 Bad RequestA requisição está malformada/inválidaFalha de validação (Data Annotations, Módulo 3 capítulo 5)
401 UnauthorizedNão autenticadoFaltou (ou expirou) o token de autenticação
403 ForbiddenAutenticado, mas sem permissãoUsuário autenticado tentando uma ação que não pode fazer
404 Not FoundRecurso não existeGET /clientes/999 quando 999 não existe
409 ConflictConflito com o estado atualE-mail já cadastrado, estoque insuficiente (o erro 50010 do Módulo 2!)
500 Internal Server ErrorErro não tratado do lado do servidorQualquer exceção que escapou sem tratamento — nunca deveria ser o "normal"
Conectando com o Módulo 2

O erro THROW 50010 (estoque insuficiente) da procedure usp_PedidoCheckout deveria virar um 409 Conflict na API — não um 500. O código 500 deveria significar "algo quebrou de forma inesperada", nunca "uma regra de negócio esperada impediu a operação".

5. Stateless — cada requisição se basta

REST assume que o servidor não guarda "memória de conversa" entre requisições — cada uma chega com toda a informação necessária (incluindo autenticação, no cabeçalho) para ser processada independentemente. Isso é o que permite escalar uma API horizontalmente (várias instâncias idênticas atrás de um load balancer) sem se preocupar em qual instância atendeu a requisição anterior.

6. Onde isso te leva

Com os princípios estabelecidos, o próximo capítulo coloca a mão na massa: como o ASP.NET Core implementa esses conceitos, tanto no formato clássico (Controllers) quanto no mais recente e minimalista (Minimal APIs).

📌 Resumo do capítulo

  • URLs identificam recursos (substantivos); o verbo HTTP diz a ação — evite verbos na URL.
  • GET, PUT e DELETE deveriam ser idempotentes; POST não é.
  • Use códigos de status com propósito: 201 para criação, 409 para conflitos de negócio (como estoque insuficiente), 500 só para falhas verdadeiramente inesperadas.
  • APIs REST são stateless — cada requisição carrega tudo que precisa para ser processada.

✏️ Praticando

  1. Desenhe as URLs e verbos de uma API REST completa para o sistema de Pedidos do Módulo 2 (Cliente, Produto, Pedido).
  2. Para cada procedure do Módulo 2 (usp_ClienteObter, usp_ClienteListar, usp_ClienteInserir, usp_ClienteAtualizar, usp_ClienteExcluir), defina o endpoint REST correspondente (verbo + URL + código de status esperado).