Uma requisição HTTP é a forma como o cliente (navegador, aplicativo, Postman) se comunica com o servidor. Ela contém:
O servidor recebe a requisição, processa e devolve uma resposta.
Cliente Servidor | | |--- Requisição HTTP ------>| | (GET /usuarios) | | |--- Processa a requisição | |--- Busca dados no banco |<-- Resposta HTTP ---------| | (200 OK + dados) | | |
O Express.js é o framework que facilita esse processo no lado do servidor com Node.js.
O Express.js é o framework web mais popular para Node.js. Ele simplifica a criação de servidores e APIs.
# Inicializa o projeto npm init -y # Instala o Express npm install express
const express = require('express'); const app = express(); app.listen(3000, () => { console.log('Servidor rodando na porta 3000'); });
const express = require('express'); const app = express(); // Rota GET para a página inicial app.get('/', (req, res) => { res.send('Bem-vindo ao servidor Express!'); }); app.listen(3000, () => { console.log('Servidor rodando na porta 3000'); });
Acessando http://localhost:3000, o navegador exibe a mensagem.
http://localhost:3000
Toda rota no Express recebe uma função callback com dois parâmetros:
app.get('/rota', (req, res) => { // req = Request (requisição do cliente) // res = Response (resposta do servidor) });
req
O req contém todas as informações enviadas pelo cliente:
req.params
req.query
req.body
req.headers
req.method
req.url
req.ip
res
O res é usado para enviar a resposta ao cliente:
res.send()
res.json()
res.status()
res.redirect()
res.sendFile()
res.render()
const express = require('express'); const app = express(); app.get('/saudacao', (req, res) => { // Lendo dados da requisição console.log('Método:', req.method); // GET console.log('URL:', req.url); // /saudacao console.log('IP:', req.ip); // ::1 // Enviando resposta res.status(200).json({ mensagem: 'Olá, mundo!', status: 'sucesso' }); }); app.listen(3000);
Query Parameters são parâmetros passados na URL após o símbolo ?.
?
http://localhost:3000/busca?nome=João&idade=25
app.get('/busca', (req, res) => { const nome = req.query.nome; // "João" const idade = req.query.idade; // "25" res.json({ nome: nome, idade: idade }); });
Query params são ideais para:
/produtos?categoria=eletronicos
/produtos?ordenar=preco
/produtos?page=2&limit=10
/buscar?termo=notebook
app.get('/produtos', (req, res) => { const categoria = req.query.categoria; const page = req.query.page || 1; const limit = req.query.limit || 10; res.json({ categoria, page, limit }); });
Route Parameters são parâmetros definidos diretamente na URL da rota.
http://localhost:3000/usuarios/42
app.get('/usuarios/:id', (req, res) => { const id = req.params.id; // "42" res.json({ mensagem: `Buscando usuário com ID: ${id}` }); });
Você pode usar vários parâmetros em uma mesma rota:
// Rota com dois parâmetros app.get('/usuarios/:userId/posts/:postId', (req, res) => { const userId = req.params.userId; const postId = req.params.postId; res.json({ usuario: userId, post: postId }); }); // Acessando: /usuarios/5/posts/100 // Resposta: { "usuario": "5", "post": "100" }
?chave=valor
/:parametro
/produtos?page=2
/produtos/42
O Express oferece um método para cada verbo HTTP:
// GET - Buscar dados app.get('/usuarios', (req, res) => { ... }); // POST - Criar novo recurso app.post('/usuarios', (req, res) => { ... }); // PUT - Atualizar recurso completo app.put('/usuarios/:id', (req, res) => { ... }); // PATCH - Atualizar parcialmente app.patch('/usuarios/:id', (req, res) => { ... }); // DELETE - Remover recurso app.delete('/usuarios/:id', (req, res) => { ... });
const express = require('express'); const app = express(); app.use(express.json()); // Para interpretar JSON no body let usuarios = [ { id: 1, nome: 'Ana' }, { id: 2, nome: 'Carlos' } ]; // LISTAR todos app.get('/usuarios', (req, res) => { res.json(usuarios); }); // BUSCAR 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 app.post('/usuarios', (req, res) => { const novoUsuario = { id: usuarios.length + 1, nome: req.body.nome }; usuarios.push(novoUsuario); res.status(201).json(novoUsuario); }); // ATUALIZAR app.put('/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' }); } usuario.nome = req.body.nome; res.json(usuario); }); // DELETAR app.delete('/usuarios/:id', (req, res) => { const id = parseInt(req.params.id); usuarios = usuarios.filter(u => u.id !== id); res.status(204).send(); });
Para enviar dados no corpo da requisição (POST, PUT, PATCH), precisamos de um middleware:
// Middleware para interpretar JSON app.use(express.json()); // Middleware para interpretar formulários app.use(express.urlencoded({ extended: true }));
app.post('/cadastro', (req, res) => { const { nome, email, senha } = req.body; console.log('Nome:', nome); console.log('Email:', email); res.status(201).json({ mensagem: 'Cadastro realizado com sucesso!', dados: { nome, email } }); });
Middleware é uma função que executa no meio do caminho entre a requisição e a resposta.
// Middleware global - executa em TODAS as rotas app.use((req, res, next) => { console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`); next(); // Passa para o próximo middleware/rota }); // Middleware específico - executa apenas em uma rota app.get('/admin', verificarAutenticacao, (req, res) => { res.send('Painel administrativo'); }); function verificarAutenticacao(req, res, next) { if (req.headers.authorization) { next(); // Usuário autenticado, continua } else { res.status(401).json({ erro: 'Não autorizado' }); } }
Para projetos maiores, podemos separar as rotas em arquivos:
routes/usuarios.js
const express = require('express'); const router = express.Router(); router.get('/', (req, res) => { res.json({ mensagem: 'Lista de usuários' }); }); router.get('/:id', (req, res) => { res.json({ mensagem: `Usuário ${req.params.id}` }); }); module.exports = router;
app.js
const express = require('express'); const app = express(); const usuariosRouter = require('./routes/usuarios'); app.use(express.json()); // Prefixo /usuarios para todas as rotas do arquivo app.use('/usuarios', usuariosRouter); app.listen(3000, () => { console.log('Servidor rodando na porta 3000'); });
Agora as rotas ficam organizadas:
GET /usuarios
GET /usuarios/5
1. Cliente envia requisição ↓ 2. Express recebe a requisição ↓ 3. Middlewares globais executam (app.use) ↓ 4. Rota correspondente é encontrada ↓ 5. Middlewares da rota executam ↓ 6. Callback da rota processa (req, res) ↓ 7. Resposta é enviada ao cliente (res.json, res.send, etc.)