المساراتُ والأفعالُ الأربعة
وصفةٌ لمهمّةٍ بعينِها: تسجيلُ GET وPOST وPUT وDELETE على مسارٍ واحد، وقراءةُ الطلبِ من داخلِ المعالِج، وضبطُ الرد. يفترضُ أنّك أنهيتَ أوّلَ خادمٍ يردُّ على طلب.
الأفعالُ الأربعةُ ودوالُّها
مُعلَنةٌ في language-truth/builtins/http_server.yaml — ١٩ مدخلًا كلُّها مستقرّة:
| الفعل | الدالّة | العددُ المُعلَنُ للوسائط |
|---|---|---|
GET | عند_طلب_جلب(الخادم، المسار، "المعالِج") | ٣ |
POST | عند_طلب_إرسال(الخادم، المسار، "المعالِج") | ٣ |
PUT | عند_طلب_استبدال(الخادم، المسار، "المعالِج") | ٣ |
DELETE | عند_طلب_حذف(الخادم، المسار، "المعالِج") | ٣ |
الوصفة
استورد شبكة
دالة اقرأ_المهام()
عين_رد_جيسون("{\"المهام\":[]}")
نهاية
دالة أضف_مهمة()
عين_حالة_الرد(201)
عين_نص_الرد("أضيفت: " + بيانات_الطلب())
نهاية
دالة بدل_مهمة()
عين_نص_الرد("بدلت المهمة على المسار " + وجهة_الطلب())
نهاية
دالة احذف_مهمة()
عين_حالة_الرد(204)
نهاية
متغير الخادم = أنشئ_خادم(0)
عند_طلب_جلب(الخادم، "/tasks"، "اقرأ_المهام")
عند_طلب_إرسال(الخادم، "/tasks"، "أضف_مهمة")
عند_طلب_استبدال(الخادم، "/tasks"، "بدل_مهمة")
عند_طلب_حذف(الخادم، "/tasks"، "احذف_مهمة")
ابدأ_الاستماع(الخادم، 8733)sad-build مسارات.ص -o مسارات.exe
./مسارات.exeوالمقيسُ عليه بـcurl — أربعُ طرقاتٍ وأربعةُ أجوبة (حُذِفَت من كلِّ ردٍّ ترويستا Date وServer اختصارًا، وما عداهما منسوخٌ كما ظهر):
$ curl -i -X GET http://127.0.0.1:8733/tasks
HTTP/1.1 200 OK
Content-Type: application/json
{"المهام":[]}
$ curl -i -X POST --data-binary @body.txt http://127.0.0.1:8733/tasks
HTTP/1.1 201 Created
Content-Type: text/plain
أضيفت: غسل الصحون
$ curl -i -X PUT http://127.0.0.1:8733/tasks
HTTP/1.1 200 OK
بدلت المهمة على المسار /tasks
$ curl -i -X DELETE http://127.0.0.1:8733/tasks
HTTP/1.1 204 No Contentومسارٌ غيرُ مسجَّلٍ يُجابُ بـ404 Not Found من الخادمِ نفسِه بلا معالِج.
قراءةُ الطلبِ من داخلِ المعالِج
المعالِجُ لا يأخذُ معاملات — الطلبُ والردُّ يُثبَّتانِ قبلَ ندائِه ويُقرآنِ من جسمِه:
| الدالّة | ترجِعُ |
|---|---|
نوع_الطلب() | الفعل (GET…) |
وجهة_الطلب() | المسارَ المطلوب |
بيانات_الطلب() | جسمَ الطلب |
معلومة_الطلب(الاسم) | ترويسةَ طلبٍ باسمِها |
قيمة_من_الرابط(الاسم) | معاملَ استعلامٍ من الرابط |
ضبطُ الرد
| الدالّة | تفعل |
|---|---|
عين_حالة_الرد(رقم) | رمزَ الحالة |
عين_نص_الرد(نصّ) | جسمًا نصّيًّا (text/plain) |
عين_رد_جيسون(نصّ) | جسمًا بـapplication/json |
عين_رد_صفحة(نصّ) | جسمًا بـtext/html |
عين_ترويسة_الرد(الاسم، القيمة) | ترويسةَ ردّ |
فتحُ الوصولِ الخارجيّ
اسمح_بالوصول_الخارجي(الخادم، "*") يُفعّلُ CORS. والوسيطُ الثاني أصلٌ بعينِه أو *.
فخّانِ مقيسان
① لا حركاتِ تشكيلٍ في اسمِ المعالِج
سُمّيت دالّةٌ أضف_مهمّة (بشدّة) وسُجِّلَت بـ"أضف_مهمّة"، فرُفِضَ البرنامجُ بـSEM049 رغمَ أنّ الدالّةَ معرَّفةٌ في الملفِّ نفسِه. وحذفُ الشدّةِ من الاسمَينِ معًا (أضف_مهمة) جعلَه يُترجَم. فأبقِ أسماءَ المعالِجاتِ عاريةً من التشكيل.
② المسارُ العربيُّ في الرابطِ لم يُطابَقْ
سُجّلَ المسارُ "/المهام" فأجابَ الخادمُ 404 Not Found: / على طلبِ curl إليه — أي أنّ المسارَ المقروءَ لم يكن ما سُجِّل. والمقيسُ أنّ مسارًا لاتينيًّا (/tasks) يُطابَقُ في الأفعالِ الأربعةِ كلِّها. فاجعلْ المسارَ لاتينيًّا؛ أمّا جسمُ الطلبِ والردِّ فعربيٌّ يمرُّ سليمًا (مقيسٌ أعلاه).
حدودٌ تخصُّ هذه الصفحة
- لا معاملاتِ مسارٍ ديناميّة (
/tasks/:id) في السطحِ المُعلَن: المطابقةُ على مسارٍ ثابت، والمتغيّرُ يُمرَّرُ استعلامًا يُقرأُ بـقيمة_من_الرابط. - لا HTTPS: الخادمُ على HTTP المجرَّد — حدٌّ مُعلَنٌ في حدودِ الويب.
- المعالِجُ بلا معاملات: توقيعٌ بمعاملاتٍ يُرفَضُ بـ
SEM051، والسببُ في قاعدةِ المعالِج.