Menu
CoddyTech

الإنشاء باستخدام POST

جزء من قسم واجهات REST API في رحلة 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، كما تعرض علامة تبويب الترويسات في الاستجابة 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 API

تدرّب بنفسك: Playground لـ Express