Endpoint: RESTful
O que é RESTful?
RESTful é um estilo arquitetural para desenvolvimento de APIs baseado no REST (Representational State Transfer), proposto por Roy Fielding em sua tese de doutorado em 2000. APIs RESTful utilizam os protocolos HTTP e seus métodos para manipulação de recursos, promovendo sistemas escaláveis, flexíveis e de fácil integração.
É amplamente utilizado para criar serviços web modernos, conectando aplicações móveis, web e IoT.
Princípios Fundamentais do REST
- Cliente-Servidor: Separação clara entre cliente e servidor, facilitando a evolução independente.
- Sem Estado (Stateless): Cada requisição HTTP contém todas as informações necessárias para o servidor processar, sem manter estado entre chamadas.
- Cacheável: Respostas devem definir se podem ser armazenadas para melhorar desempenho.
- Interface Uniforme: Simplifica e desacopla a arquitetura. Isso inclui identificação de recursos via URIs, manipulação de recursos via representações e auto-descrição das mensagens.
- Sistema em Camadas: Cliente não deve saber se está comunicando diretamente com servidor final ou intermediário (ex: proxy, gateway).
- Code on Demand (opcional): Servidor pode enviar código executável ao cliente para extensões temporárias.
Recursos e Endpoints
REST organiza dados em recursos, que são representações de entidades (ex: usuários, produtos, pedidos). Cada recurso é identificado por uma URI única.
Exemplo:
GET /usuarios— lista todos os usuáriosGET /usuarios/123— obtém detalhes do usuário com ID 123POST /usuarios— cria um novo usuárioPUT /usuarios/123— atualiza o usuário 123DELETE /usuarios/123— remove o usuário 123
Métodos HTTP Usados em APIs RESTful
- GET: Recupera recurso(s). Deve ser idempotente e sem efeitos colaterais.
- POST: Cria um novo recurso ou executa operações que modificam o estado.
- PUT: Atualiza um recurso completo. Também idempotente.
- PATCH: Atualiza parcialmente um recurso.
- DELETE: Remove um recurso.
- OPTIONS: Consulta quais métodos são suportados por um endpoint.
Status HTTP Comuns
APIs RESTful usam códigos HTTP para indicar o resultado da requisição:
200 OK— Sucesso na requisição.201 Created— Recurso criado com sucesso (resposta a POST).204 No Content— Requisição bem sucedida, sem corpo na resposta.400 Bad Request— Requisição inválida ou malformada.401 Unauthorized— Falha na autenticação.403 Forbidden— Cliente não tem permissão.404 Not Found— Recurso não encontrado.409 Conflict— Conflito, como tentativa de criar recurso duplicado.500 Internal Server Error— Erro do servidor.
Exemplo Prático: API RESTful em Node.js com Express
Um endpoint simples para manipular usuários:
const express = require('express');
const app = express();
app.use(express.json());
let usuarios = [
{ id: 1, nome: 'Alice', email: 'alice@exemplo.com' },
{ id: 2, nome: 'Bob', email: 'bob@exemplo.com' }
];
// Listar todos os usuários
app.get('/usuarios', (req, res) => {
res.json(usuarios);
});
// Obter usuário por id
app.get('/usuarios/:id', (req, res) => {
const id = parseInt(req.params.id);
const usuario = usuarios.find(u => u.id === id);
if (!usuario) return res.status(404).json({ erro: 'Usuário não encontrado' });
res.json(usuario);
});
// Criar usuário
app.post('/usuarios', (req, res) => {
const { nome, email } = req.body;
const id = usuarios.length ? usuarios[usuarios.length - 1].id + 1 : 1;
const novoUsuario = { id, nome, email };
usuarios.push(novoUsuario);
res.status(201).json(novoUsuario);
});
// Atualizar usuário
app.put('/usuarios/:id', (req, res) => {
const id = parseInt(req.params.id);
const index = usuarios.findIndex(u => u.id === id);
if (index === -1) return res.status(404).json({ erro: 'Usuário não encontrado' });
const { nome, email } = req.body;
usuarios[index] = { id, nome, email };
res.json(usuarios[index]);
});
// Deletar usuário
app.delete('/usuarios/:id', (req, res) => {
const id = parseInt(req.params.id);
usuarios = usuarios.filter(u => u.id !== id);
res.status(204).send();
});
app.listen(3000, () => console.log('API rodando na porta 3000'));
Boas Práticas para APIs RESTful
- Design de URIs: Use nomes no plural para recursos, evite verbos.
- Versionamento: Inclua versão na URI, ex:
/v1/usuarios, para facilitar atualizações. - Documentação clara: Use ferramentas como Swagger/OpenAPI para descrever sua API.
- Paginação: Para coleções grandes, implemente paginação via query params (ex:
?page=2&limit=20). - Filtragem e ordenação: Permita filtrar e ordenar resultados para melhorar a experiência do cliente.
- Erros estruturados: Padronize o formato das mensagens de erro para facilitar debugging.
- Segurança: Sempre use HTTPS, implemente autenticação e controle de acesso.
RESTful vs Outros Estilos de API
Comparado a outras arquiteturas, REST tem:
- SOAP: Mais simples, leve e baseado em HTTP padrão.
- GraphQL: Permite consultas flexíveis, mas é mais complexo e não usa HTTP diretamente para cada operação.
- gRPC: Baseado em RPC, eficiente para comunicação entre serviços internos.