REST nao e um protocolo β€” e um estilo arquitetural. HTTP e o protocolo. Uma API pode usar HTTP sem ser RESTful, e uma API RESTful sempre usa HTTP como transporte.

Principios REST

REST (Representational State Transfer) foi definido por Roy Fielding em 2000. Sao 6 constraints arquiteturais:

PrincipioDescricaoImpacto pratico
StatelessCada request contem toda informacao necessaria β€” servidor nao guarda sessaoEscalabilidade horizontal: qualquer instancia atende qualquer request
Resource-orientedURIs representam recursos (substantivos), nao acoes (verbos)/api/products/42 em vez de /api/getProduct?id=42
Uniform InterfaceMetodos HTTP padrao para operacoes (GET, POST, PUT, DELETE)Previsibilidade β€” qualquer dev sabe o que esperar
HATEOASRespostas incluem links para acoes possiveis sobre o recursoCliente descobre a API navegando β€” raro em APIs reais
Client-ServerSeparacao clara de responsabilidadesFrontend e backend evoluem independentemente
CacheableRespostas devem indicar se podem ser cacheadasHeaders: Cache-Control, ETag, Last-Modified

Metodos HTTP

MetodoOperacaoIdempotente?Safe?Request BodyExemplo
GETLer recursoSimSimNaoGET /api/products/42
POSTCriar recursoNaoNaoSimPOST /api/products
PUTSubstituir recurso inteiroSimNaoSimPUT /api/products/42
PATCHAtualizar parcialmenteNaoNaoSimPATCH /api/products/42
DELETERemover recursoSimNaoOpcionalDELETE /api/products/42
HTTProuteinjectcallqueryClientBrowser/AppAPI GatewayReverse proxyControllerEndpoint/RouteServiceBusiness logicRepositoryData accessDatabaseSQL/NoSQL

Content Negotiation

O cliente indica o formato desejado via header Accept. O servidor responde com o formato ou 406 Not Acceptable.

// Configurar formatters no Program.cs builder.Services.AddControllers(options => { options.RespectBrowserAcceptHeader = true; options.ReturnHttpNotAcceptable = true; // retorna 406 se formato nao suportado }) .AddXmlSerializerFormatters() // suporta Accept: application/xml .AddJsonOptions(opt => { opt.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; opt.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; }); // Request com Accept: application/json β†’ JSON // Request com Accept: application/xml β†’ XML // Request com Accept: text/csv β†’ 406 Not Acceptable
Qual a diferenca entre PUT e PATCH?
PUT substitui o recurso inteiro β€” voce envia todos os campos. Se omitir um campo, ele volta ao valor default ou null. PATCH atualiza apenas os campos enviados β€” os demais permanecem inalterados. PUT e idempotente por definicao (mesma request = mesmo resultado). PATCH tecnicamente nao e idempotente (ex: { "op": "increment", "path": "/views" }). Na pratica, a maioria das APIs usa PATCH como se fosse idempotente (partial update simples).