Consumindo a API de Produtos com HTML, CSS e JavaScript.
// Listar produtos
const res = await fetch(
'/api/produtos'
);
const data = await res.json();
console.log(data.produtos);
const res = await fetch('/api/produtos', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({
nome: 'Notebook',
preco: 2999.90,
categoria: 'Eletronicos'
})
});
const API = '/api/produtos';
async function carregarProdutos() {
const res = await fetch(API);
const { produtos } = await res.json();
const lista = document.getElementById('lista-produtos');
lista.innerHTML = produtos.map(p => `
<div class="card-produto">
<h3>${p.nome}</h3>
<p class="preco">R$ ${p.preco.toFixed(2)}</p>
<span class="categoria">${p.categoria}</span>
<button onclick="deletar('${p._id}')">Excluir</button>
</div>
`).join('');
}
carregarProdutos();
<form id="form-produto">
<input name="nome"
placeholder="Nome do produto"
required />
<input name="preco"
type="number" step="0.01"
placeholder="Preco" required />
<select name="categoria">
<option>Eletronicos</option>
<option>Roupas</option>
<option>Alimentos</option>
<option>Livros</option>
</select>
<button type="submit">Adicionar</button>
</form>
const form = document
.getElementById('form-produto');
form.addEventListener('submit',
async (e) => {
e.preventDefault();
const dados = Object.fromEntries(
new FormData(form)
);
dados.preco = Number(dados.preco);
await fetch(API, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify(dados)
});
form.reset();
carregarProdutos();
});
async function deletar(id) {
if (!confirm('Excluir?')) return;
await fetch(`${API}/${id}`, {
method: 'DELETE',
headers: {
'Authorization':
`Bearer ${token}`
}
});
carregarProdutos();
}
async function atualizar(id, dados) {
await fetch(`${API}/${id}`, {
method: 'PUT',
headers: {
'Content-Type':
'application/json',
'Authorization':
`Bearer ${token}`
},
body: JSON.stringify(dados)
});
carregarProdutos();
}
let token = localStorage.getItem('token');
async function login(email, senha) {
const res = await fetch('/api/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, senha })
});
if (!res.ok) return alert('Credenciais invalidas');
const data = await res.json();
token = data.token;
localStorage.setItem('token', token);
atualizarUI();
}
function logout() {
token = null;
localStorage.removeItem('token');
atualizarUI();
}
function atualizarUI() {
document.getElementById('form-login').hidden = !!token;
document.getElementById('painel-admin').hidden = !token;
}
// No index.js do servidor
app.use(
express.static('public')
);
// Estrutura da pasta public/
public/
index.html
css/
style.css
js/
app.js
// Se separar, habilitar CORS
const cors = require('cors');
app.use(cors({
origin: 'https://meusite.com'
}));
async function carregarProdutos() {
const lista = document.getElementById('lista-produtos');
lista.innerHTML = '<p class="loading">Carregando...</p>';
try {
const res = await fetch(API);
if (!res.ok) throw new Error(`Erro ${res.status}`);
const { produtos } = await res.json();
if (produtos.length === 0) {
lista.innerHTML = '<p>Nenhum produto.</p>';
return;
}
// renderizar produtos...
} catch (err) {
lista.innerHTML = `<p class="erro">${err.message}</p>`;
}
}
public/ no projeto da aula 32index.html, css/style.css e js/app.jsDocumentação de APIs e testes com Postman.