Menu
CoddyTech

Ersetzen mit PUT

Teil des Abschnitts REST-APIs der Node.js-Journey von Coddy. Lektion 5 von 18.

Ein Bearbeitungsformular sendet die gesamte Aufgabe zurück, alle Felder auf einmal. PUT bedeutet „die Ressource hiermit ersetzen“, daher muss der Body vollständig sein.

PATCH /api/invoices/7  { "paid": true }               → paid changes
PUT   /api/invoices/7  { "amount": 90, "paid": true } → a new invoice 7
PUT   /api/invoices/7  { "paid": true }               → 400: amount missing

Ein PUT mit einem fehlenden Feld ergibt eine 400-Fehlermeldung: Würde man die Rechnung nur teilweise ersetzen, ginge der Betrag verloren. Felder, die dem Server gehören, wie die id und der Erstellungszeitpunkt, werden aus der alten Version übernommen, niemals aus dem Body:

const { id, issuedAt } = invoices[index];
invoices[index] = { id, amount, paid, issuedAt };
challenge icon

Aufgabe

Einfach
  • PUT /api/tasks/:id ersetzt title und done durch die Werte im Anforderungstext und antwortet mit 200 und der Aufgabe.
  • id und createdAt bleiben unverändert.
  • Ein fehlendes title oder done: 400. Eine unbekannte id: 404.

Sende PUT /api/tasks/2 mit { "title": "Book the big room", "done": true } und danach mit { "done": true }.

Probier es selbst

import { Router } from 'express';
import { nextId, 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);
});

router.post('/', (req, res) => {
    const { title } = req.body ?? {};
    if (!title) {
        return res.status(400).json({ error: 'title is required' });
    }
    const task = { id: nextId(), title, done: false, createdAt: new Date().toISOString() };
    tasks.push(task);
    res.status(201).location(`/api/tasks/${task.id}`).json(task);
});

router.patch('/: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' });
    }
    const { title, done } = req.body ?? {};
    if (title !== undefined) task.title = title;
    if (done !== undefined) task.done = done;
    res.json(task);
});

router.delete('/:id', (req, res) => {
    const index = tasks.findIndex((t) => t.id === Number(req.params.id));
    if (index === -1) {
        return res.status(404).json({ error: 'Task not found' });
    }
    tasks.splice(index, 1);
    res.status(204).end();
});

export default router;
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in REST-APIs