الإنشاء باستخدام 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);التحدي
سهليحتاج العملاء إلى طريقة لإضافة المهام. أضف مسار POST ينشئ مهمة ويخبر العميل بمكان المهمة الجديدة.
- في
routes/tasks.js، أضف مسارًا لـPOST /api/tasks(داخل الموجّه، يكون المسار'/'). يقرأ المسارtitleمن متن JSON، مثل{ "title": "Order new chairs" }. - أنشئ المهمة الجديدة بأربعة حقول:
id: من الدالةnextId()فيstore.js. استوردها بجانبtasks.title: من المتن.done:false.createdAt:new Date().toISOString()، الوقت الحالي كنص.
أضفها إلى مصفوفة
tasks، لكي يعرضهاGET /api/tasksأيضًا. - أعِد الحالة 201 والمهمة الجديدة بصيغة JSON. عيّن ترويسة
Locationإلى عنوان URL الخاص بالمهمة: بالنسبة إلى المهمة 4، يكون العنوان/api/tasks/4. عند تشغيل البرنامج لأول مرة، سيبدو متن الاستجابة كما يلي (قيمةcreatedAtلديك هي وقت إرسالها):{ "id": 4, "title": "Order new chairs", "done": false, "createdAt": "2026-10-30T09:12:44.512Z" } - عندما لا يحتوي المتن على
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
1الموارد والأفعال
الموارد وعناوين URLالإنشاء باستخدام POST4المتصفحات والإصدارات والإعدادات
ما هو المصدرالسماح لمصدر آخرCORSصفحة تستدعي APIتدرّب بنفسك: Playground لـ Express