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 missingEin 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 };Aufgabe
EinfachPUT /api/tasks/:idersetzttitleunddonedurch die Werte im Anforderungstext und antwortet mit 200 und der Aufgabe.idundcreatedAtbleiben unverändert.- Ein fehlendes
titleoderdone: 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;
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in REST-APIs
1Ressourcen und Verben
Ressourcen und URLsErstellen mit POST