Menu
CoddyTech

יצירה באמצעות POST

חלק מהיחידה REST APIs במסלול ה-Node.js של Coddy. שיעור 2 מתוך 25.

לקוח שמוסיף משימה צריך לדעת היכן המשימה החדשה נמצאת. הוא שולח את המשאב החדש לכתובת ה-URL של הרשימה באמצעות POST, והשרת משיב 201 Created עם המשאב ועם כותרת Location שמציינת את כתובת ה-URL שלו.

POST /api/events   { "name": "Launch party" }

201 Created
Location: /api/events/12
{ "id": 12, "name": "Launch party" }

השרת בוחר את המזהה, כך ששני לקוחות לעולם לא יוכלו לטעון לאותו מזהה. בעזרת הכותרת Location, הלקוח יכול לשלוף את האירוע החדש בלי לבנות את כתובת ה-URL בעצמו. res.location(path) מגדירה את הכותרת הזו, והיא משתלבת בשרשור כמו res.status:

res.status(201).location(`/api/events/${event.id}`).json(event);
challenge icon

אתגר

קל

לקוחות צריכים דרך להוסיף משימות. הוסיפו נתיב POST שיוצר משימה ומודיע ללקוח היכן נמצאת המשימה החדשה.

  1. ב־routes/tasks.js, הוסיפו נתיב עבור POST /api/tasks (בתוך הנתב, הנתיב הזה הוא '/'). הוא קורא את title מתוך גוף ה־JSON, לדוגמה { "title": "Order new chairs" }.
  2. בנו את המשימה החדשה עם ארבעה שדות:
    • id: מתוך הפונקציה nextId() שב־store.js. ייבאו אותה לצד tasks.
    • title: מתוך הגוף.
    • done: false.
    • createdAt: new Date().toISOString(), השעה הנוכחית כטקסט.

    הוסיפו אותה למערך tasks, כדי שגם GET /api/tasks יציג אותה.

  3. השיבו עם סטטוס 201 ועם המשימה החדשה כ־JSON. הגדירו את הכותרת Location לכתובת ה־URL של המשימה עצמה: עבור משימה 4 זו הכתובת /api/tasks/4. בהרצה חדשה, גוף התגובה נראה כך (createdAt שלכם יהיה הזמן שבו תשלחו את הבקשה):
    { "id": 4, "title": "Order new chairs", "done": false, "createdAt": "2026-10-30T09:12:44.512Z" }
  4. אם אין בגוף title, השיבו עם סטטוס 400 ועם { "error": "title is required" }, ואל תוסיפו דבר לרשימה.

נסו זאת: בחרו POST, הנתיב /api/tasks, והגוף { "title": "Order new chairs" }. אתם אמורים לראות 201 ואת המשימה שלמעלה עם מזהה 4, ובכרטיסייה Headers של התגובה מופיע Location: /api/tasks/4. שלחו GET /api/tasks/4: תקבלו בחזרה את אותה המשימה. לאחר מכן שלחו POST עם {} אל /api/tasks: תקבלו 400 עם השגיאה, ו־GET /api/tasks עדיין יציג 4 משימות, כי בקשת ה־POST שנדחתה לא הוסיפה דבר.

נסו בעצמכם

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;

כל השיעורים ביחידה REST APIs

תרגלו בעצמכם: Express אונליין