Menu
CoddyTech

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);
challenge icon

Desafio

Fácil

Os 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.

  1. Em routes/tasks.js, adicione uma rota para POST /api/tasks (dentro do roteador, esse caminho é '/'). Ela lê title do corpo JSON, por exemplo { "title": "Order new chairs" }.
  2. Crie a nova tarefa com quatro campos:
    • id: obtido da função nextId() em store.js. Importe-a junto com tasks.
    • title: obtido do corpo.
    • done: false.
    • createdAt: new Date().toISOString(), o horário atual em formato de texto.

    Adicione-a ao array tasks, para que GET /api/tasks também a exiba.

  3. Responda com o status 201 e a nova tarefa em JSON. Defina o cabeçalho Location como 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 seu createdAt será o momento em que você enviar a solicitação):
    { "id": 4, "title": "Order new chairs", "done": false, "createdAt": "2026-10-30T09:12:44.512Z" }
  4. 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

Pratique por conta própria: Playground de Express