Técnico em Desenvolvimento de Sistemas
Aprenda a semântica dos verbos HTTP, convenções de URLs limpas e como construir, depurar e testar endpoints de APIs profissionais na prática.
REST (Representational State Transfer) não é uma linguagem ou biblioteca, mas um conjunto de restrições arquiteturais que tornam as APIs previsíveis, escaláveis e universais.
No mundo REST, tudo o que o seu sistema gerencia é considerado um Recurso. Recursos são substantivos no plural que representam entidades do seu banco de dados ou domínio de negócio.
URLs NUNCA devem conter verbos! A ação que será executada (cadastrar, buscar, atualizar, deletar) NÃO pertence à URL, e sim ao Verbo HTTP da requisição.
Define o comportamento (GET, POST, PUT, DELETE).
Identifica o substantivo (/produtos, /produtos/1).
Qualquer cliente no mundo entende a intenção.
Explore cada método HTTP, veja o código no servidor Express e como configurar os testes no Thunder Client.
Utilizado exclusivamente para solicitar e consultar dados do servidor. É uma operação segura e idempotente: executá-la uma ou cem vezes não deve alterar o estado interno do banco de dados.
GET /produtos retorna todos os produtos.
GET /produtos/:id usa req.params para filtrar por ID.
http://localhost:3000/produtos.// 1. Rota para Listar todos os Produtos (Coleção)
app.get('/produtos', (req, res) => {
// Retorna HTTP Status 200 OK com o array de produtos em formato JSON
return res.status(200).json(produtos);
});
// 2. Rota para Buscar um Produto específico pelo ID (Parâmetro de Rota)
app.get('/produtos/:id', (req, res) => {
const { id } = req.params; // Extrai o ID da URL
// Procura o produto no array em memória
const produto = produtos.find(p => p.id === parseInt(id));
// Caso o produto não exista, retorna 404 Not Found
if (!produto) {
return res.status(404).json({ mensagem: 'Produto não encontrado.' });
}
// Se existir, retorna 200 OK com os dados do produto encontrado
return res.status(200).json(produto);
});
Envia dados para serem processados e criados no servidor. O padrão RESTful especifica que a criação bem-sucedida de um novo recurso deve responder com o status 201 Created.
app.use(express.json()) no início do seu código para que o Express consiga ler o req.body.
POST /produtos).
http://localhost:3000/produtos.{"nome": "Teclado", "preco": 250.00}.// OBRIGATÓRIO: Habilitar o parser de corpo JSON no Express
app.use(express.json());
// Rota para Cadastrar um Novo Produto
app.post('/produtos', (req, res) => {
// Extrai as informações enviadas pelo cliente no corpo (body) da requisição
const { nome, preco } = req.body;
// Validação simples dos dados recebidos
if (!nome || preco === undefined) {
return res.status(400).json({ mensagem: 'Nome e Preço são obrigatórios.' });
}
// Criação do novo registro com identificador único incremental
const novoProduto = {
id: produtos.length > 0 ? produtos[produtos.length - 1].id + 1 : 1,
nome,
preco: Number(preco)
};
produtos.push(novoProduto);
// RESTful: Retorna HTTP Status 201 Created + Objeto Criado
return res.status(201).json({
mensagem: 'Produto cadastrado com sucesso!',
produto: novoProduto
});
});
Utilizado para substituir ou atualizar todos os dados de um item existente. A mágica do PUT no Express reside na combinação de dois canais de dados simultâneos:
/produtos/1).
http://localhost:3000/produtos/1.{"nome": "Teclado RGB Pro", "preco": 299.90}.// Rota para Atualizar um Produto Existente
app.put('/produtos/:id', (req, res) => {
const { id } = req.params; // ID na URL
const { nome, preco } = req.body; // Novos dados no Body
// Localiza a posição do produto no array
const index = produtos.findIndex(p => p.id === parseInt(id));
// Caso o produto não exista no banco/memória
if (index === -1) {
return res.status(404).json({ mensagem: 'Produto não encontrado para atualização.' });
}
// Atualiza os dados mantendo o ID original
produtos[index] = {
...produtos[index],
nome: nome || produtos[index].nome,
preco: preco !== undefined ? Number(preco) : produtos[index].preco
};
// Retorna HTTP Status 200 OK com o registro atualizado
return res.status(200).json({
mensagem: 'Produto atualizado com sucesso!',
produto: produtos[index]
});
});
Utilizado para remover permanentemente um registro do servidor. Informa-se o ID do recurso a ser removido diretamente no Path da URL.
404 Not Found.
http://localhost:3000/produtos/1.// Rota para Deletar um Produto pelo ID
app.delete('/produtos/:id', (req, res) => {
const { id } = req.params;
// Encontra a posição do item
const index = produtos.findIndex(p => p.id === parseInt(id));
// Se não existir, retorna 404 Not Found
if (index === -1) {
return res.status(404).json({ mensagem: 'Produto não encontrado para exclusão.' });
}
// Remove o elemento do array em memória
produtos.splice(index, 1);
// Retorna HTTP Status 200 OK com mensagem de confirmação
return res.status(200).json({
mensagem: `Produto com ID ${id} removido com sucesso!`
});
});
Experimente a interface idêntica à extensão do Thunder Client no VS Code. Clique em "Enviar" para testar o método selecionado na aba ativa!
Desafios para consolidar os conceitos aprendidos em sala. Refatore URLs, implemente a API em memória e teste todas as rotas no Thunder Client.
Identifique as rotas com anti-patterns e visualize a conversão para o padrão RESTful correto.
| Objetivo / Ação | Rota Incorreta (Anti-pattern) | Rota RESTful Correta | Justificativa & Semântica |
|---|
Construa um CRUD completo em memória para o recurso /alunos contendo os campos nome, matricula e curso. Marque cada etapa concluída:
Sequência exata de requisições que você deve disparar no Thunder Client para homologar a API:
404 para IDs que não existem é tão importante quanto testar o caminho feliz!
Crie uma rota para adicionar uma nota a um aluno específico:
POST /alunos/:id/notas.
O corpo da requisição deve receber { "disciplina": "Back-End I", "valor": 9.5 } e o aluno deve conter um array interno notas: [].
Cada estudante possui um tema exclusivo de negócio. Localize o número da sua chamada na lista abaixo ou pesquise pelo seu domínio para visualizar seus requisitos, atributos, rotas e payloads para o Thunder Client.
Desenvolva uma API para gerenciamento do catálogo de livros da biblioteca municipal.
| Campo | Tipo | Descrição |
|---|
Registrar um empréstimo do livro com nome do leitor e data de devolução prevista.
{
"titulo": "O Guia do Mochileiro das Galáxias",
"autor": "Douglas Adams",
"anoPublicacao": 1979,
"paginas": 208
}
http://localhost:3000/livros), cole o JSON acima e clique em Send.