Criando com POST
Parte da seção APIs REST do Journey de Node.js da Coddy. Lição 2 de 25.
Um cliente que adiciona uma tarefa precisa saber onde a nova tarefa fica. Ele envia o novo recurso para a URL da lista com POST, e o servidor responde 201 Created com o recurso e um cabeçalho Location que indica sua URL.
POST /api/events { "name": "Launch party" }
201 Created
Location: /api/events/12
{ "id": 12, "name": "Launch party" }O servidor escolhe o id, então dois clientes nunca podem reivindicar o mesmo. Com o cabeçalho Location, o cliente pode buscar o novo evento sem montar a URL por conta própria. res.location(path) define esse cabeçalho, e pode ser encadeado como res.status:
res.status(201).location(`/api/events/${event.id}`).json(event);Desafio
FácilOs clientes precisam de uma maneira de adicionar tarefas. Adicione uma rota POST que crie uma tarefa e informe ao cliente onde a nova tarefa está localizada.
- Em
routes/tasks.js, adicione uma rota paraPOST /api/tasks(dentro do roteador, esse caminho é'/'). Ela lêtitledo corpo JSON, por exemplo{ "title": "Order new chairs" }. - Crie a nova tarefa com quatro campos:
id: obtido da funçãonextId()emstore.js. Importe-a junto comtasks.title: obtido do corpo.done:false.createdAt:new Date().toISOString(), o horário atual em formato de texto.
Adicione-a ao array
tasks, para queGET /api/taskstambém a exiba. - Responda com o status 201 e a nova tarefa em JSON. Defina o cabeçalho
Locationcomo a URL da própria tarefa: para a tarefa 4, é/api/tasks/4. Em uma execução nova, o corpo da resposta fica assim (o seucreatedAtserá o momento em que você enviar a solicitação):{ "id": 4, "title": "Order new chairs", "done": false, "createdAt": "2026-10-30T09:12:44.512Z" } - Quando o corpo não tiver
title, responda com o status 400 e{ "error": "title is required" }, e não adicione nada à lista.
Experimente: escolha POST, caminho /api/tasks, corpo { "title": "Order new chairs" }. Você deverá ver 201 e a tarefa acima com id 4, e a aba Headers da resposta mostrará Location: /api/tasks/4. Envie GET /api/tasks/4: você receberá a mesma tarefa de volta. Em seguida, envie POST {} para /api/tasks: você receberá 400 com o erro, e GET /api/tasks ainda listará 4 tarefas, porque o POST recusado não adicionou nada.
Experimente você mesmo
import { Router } from 'express';
import { tasks } from '../store.js';
const router = Router();
router.get('/', (req, res) => {
res.json(tasks);
});
router.get('/:id', (req, res) => {
const task = tasks.find((t) => t.id === Number(req.params.id));
if (!task) {
return res.status(404).json({ error: 'Task not found' });
}
res.json(task);
});
export default router;
Todas as lições de APIs REST
1Recursos e verbos
Recursos e URLsCriando com POST4Navegadores, versões e configuração
O que é uma origemPermitindo outra origemCORSUma página que chama a APIPratique por conta própria: Playground de Express