Se você já montou uma página em JavaScript, o próximo passo natural é fazer esse código conversar com outros programas. Uma API REST resolve exatamente esse problema: ela recebe requisições HTTP, executa uma regra e devolve dados, normalmente em JSON. Neste tutorial, vamos criar uma API pequena de tarefas com Node.js e Express.
O exemplo é simples, mas não é de enfeite. Ao final, você terá rotas GET e POST, validação básica, códigos de status e um teste feito pelo terminal. Os dados ficam em memória para facilitar o aprendizado; em um projeto real, você trocaria esse array por um banco de dados.

O que você vai construir
Vamos criar um serviço com três endpoints:
GET /api/saude: confirma que a API está funcionando;GET /api/tarefas: lista tarefas;POST /api/tarefas: cadastra uma tarefa nova.
Node.js é um ambiente de execução que permite usar JavaScript fora do navegador. A documentação do projeto explica que ele usa o motor V8 e trabalha com operações de entrada e saída assíncronas, como rede e arquivos. O Express entra como uma camada mais conveniente para declarar rotas, middleware e respostas HTTP.
Em linguagem simples: o Node mantém o programa rodando no servidor; o Express ajuda a dizer o que fazer quando chegar um GET ou POST em determinado endereço. A própria documentação do Express resume uma rota como uma combinação de método HTTP, caminho e função responsável pela resposta.
Pré-requisitos
Você precisa de:
- Node.js instalado no computador;
- npm, que normalmente acompanha a instalação do Node;
- um editor de código;
- um terminal para executar os comandos.
Confira as instalações com:
node --version
npm --version
Não é necessário instalar banco de dados, Postman ou outra ferramenta gráfica. Vamos usar o curl para testar as requisições. Se você preferir, pode substituir o terminal pelo Insomnia, Postman ou pela extensão REST Client do VS Code.
1. Crie o projeto e instale o Express
Crie uma pasta e inicialize um projeto npm:
mkdir jsms-api-exemplo
cd jsms-api-exemplo
npm init -y
npm install express
O comando npm install express adiciona o framework ao projeto e registra a dependência no package.json. Isso é melhor do que copiar arquivos de uma instalação para outra: qualquer pessoa que baixar o projeto poderá reconstruir as dependências com npm install.
Crie também um arquivo chamado server.js. É nele que ficará o servidor.
2. Escreva o servidor básico
Comece importando o Express, criando a aplicação e escolhendo a porta:
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
app.use(express.json());
O middleware express.json() permite interpretar corpos de requisição enviados em JSON. Sem ele, req.body pode ficar indefinido quando um cliente mandar dados no formato application/json.
3. Crie dados temporários e rotas
Para manter o exemplo pequeno, vamos guardar duas tarefas em um array:
const tarefas = [
{ id: 1, titulo: 'Ler a documentação do Express', concluida: true },
{ id: 2, titulo: 'Testar a API com curl', concluida: false }
];
Agora crie a rota de saúde e a rota que lista os registros:
app.get('/api/saude', (req, res) => {
res.json({ status: 'ok', servico: 'jsms-api-exemplo' });
});
app.get('/api/tarefas', (req, res) => {
res.json(tarefas);
});
O método app.get() fica responsável por requisições GET. Já res.json() transforma o objeto JavaScript em uma resposta JSON e define o tipo de conteúdo apropriado.
4. Adicione uma rota POST com validação
Uma API não deve aceitar qualquer entrada silenciosamente. Neste exemplo, vamos exigir que o campo titulo seja um texto que não esteja vazio:
app.post('/api/tarefas', (req, res) => {
const titulo = typeof req.body.titulo === 'string'
? req.body.titulo.trim()
: '';
if (!titulo) {
return res.status(400).json({
erro: 'O campo titulo é obrigatório.'
});
}
const tarefa = {
id: tarefas.length + 1,
titulo,
concluida: false
};
tarefas.push(tarefa);
res.status(201).json(tarefa);
});
O status 400 indica que o cliente enviou uma requisição inválida. Quando o cadastro dá certo, usamos 201 Created, que comunica que um novo recurso foi criado. Essa diferença parece pequena, mas ajuda aplicativos, logs e pessoas a entenderem o resultado sem depender apenas do texto da resposta.
5. Trate rotas inexistentes e inicie o servidor
Antes de iniciar a aplicação, acrescente uma resposta para caminhos que não existem:
app.use((req, res) => {
res.status(404).json({ erro: 'Rota não encontrada.' });
});
app.listen(PORT, () => {
console.log(`API disponível em http://localhost:${PORT}`);
});
O arquivo completo deve ficar assim:
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
app.use(express.json());
const tarefas = [
{ id: 1, titulo: 'Ler a documentação do Express', concluida: true },
{ id: 2, titulo: 'Testar a API com curl', concluida: false }
];
app.get('/api/saude', (req, res) => {
res.json({ status: 'ok', servico: 'jsms-api-exemplo' });
});
app.get('/api/tarefas', (req, res) => {
res.json(tarefas);
});
app.post('/api/tarefas', (req, res) => {
const titulo = typeof req.body.titulo === 'string' ? req.body.titulo.trim() : '';
if (!titulo) {
return res.status(400).json({ erro: 'O campo titulo é obrigatório.' });
}
const tarefa = { id: tarefas.length + 1, titulo, concluida: false };
tarefas.push(tarefa);
res.status(201).json(tarefa);
});
app.use((req, res) => {
res.status(404).json({ erro: 'Rota não encontrada.' });
});
app.listen(PORT, () => {
console.log(`API disponível em http://localhost:${PORT}`);
});
6. Execute e teste a API
Inicie o servidor:
node server.js
Deixe esse terminal aberto e use outro para testar a rota de saúde:
curl http://localhost:3000/api/saude
A resposta esperada é parecida com:
{"status":"ok","servico":"jsms-api-exemplo"}
Liste as tarefas:
curl http://localhost:3000/api/tarefas
Por fim, envie uma tarefa nova. A opção -H informa que o corpo está em JSON e -d contém os dados:
curl -X POST http://localhost:3000/api/tarefas \
-H "Content-Type: application/json" \
-d '{"titulo":"Publicar tutorial no JSMS"}'
Se tudo estiver certo, a API devolverá o objeto criado com status 201. Tente também enviar {}. Nesse caso, a validação deve devolver status 400 e a mensagem de campo obrigatório. Essa é uma verificação importante: não basta o servidor “abrir”; cada caminho precisa responder como esperado.
O que este exemplo ainda não resolve
A aplicação funciona, mas é propositalmente mínima. O array vive na memória e será apagado quando o processo for encerrado. O ID também é calculado de maneira simples e não serve para concorrência real. Para transformar o exemplo em um serviço de produção, você teria de adicionar:
- um banco de dados, como PostgreSQL, MySQL ou SQLite;
- validação mais completa e limites de tamanho para os campos;
- autenticação e autorização;
- tratamento centralizado de erros;
- logs, testes automatizados e monitoramento;
- HTTPS e configuração segura de variáveis de ambiente.
Também vale separar as rotas em arquivos quando o projeto crescer. Uma API com dez endpoints pode caber em um arquivo durante o estudo; uma API com dezenas de recursos vira rapidamente um emaranhado difícil de manter.
Node.js e Express valem a pena para começar?
Para quem já conhece JavaScript, a dupla reduz a troca de contexto entre front-end e back-end. O Express oferece uma estrutura direta para rotas e middleware, enquanto o Node fornece o ambiente para executar o servidor e acessar rede, arquivos e outros serviços.
A limitação é que simplicidade não significa projeto pronto. Segurança, persistência, testes e organização continuam sendo responsabilidade de quem desenvolve. O tutorial é um ponto de partida para entender o caminho da requisição, não uma receita para colocar qualquer API na internet sem revisão.
Se sua ideia é transformar um formulário em um fluxo operacional, veja também como criar um sistema de chamados com Google Forms e Google Sheets. A lógica é parecida: receber dados, validar a entrada e encaminhá-los para o próximo passo.
Perguntas frequentes
O que é uma API REST?
É uma interface que permite a outros programas acessar recursos por requisições HTTP, usando caminhos, métodos como GET e POST e respostas, geralmente em JSON.
Preciso usar Express para criar uma API com Node.js?
Não. O Node.js tem módulos nativos para criar um servidor HTTP. O Express é opcional, mas reduz o código necessário para organizar rotas, middleware e respostas.
Por que os dados somem quando o servidor reinicia?
Porque o exemplo guarda as tarefas em um array na memória do processo. Para manter dados, use um banco de dados ou outro armazenamento persistente.
Qual ferramenta posso usar para testar uma API?
Você pode usar curl, Postman, Insomnia, REST Client ou qualquer cliente capaz de enviar requisições HTTP e exibir respostas JSON.