Skip to content

المساراتُ والأفعالُ الأربعة

وصفةٌ لمهمّةٍ بعينِها: تسجيلُ GET وPOST وPUT وDELETE على مسارٍ واحد، وقراءةُ الطلبِ من داخلِ المعالِج، وضبطُ الرد. يفترضُ أنّك أنهيتَ أوّلَ خادمٍ يردُّ على طلب.

الأفعالُ الأربعةُ ودوالُّها

مُعلَنةٌ في language-truth/builtins/http_server.yaml — ١٩ مدخلًا كلُّها مستقرّة:

الفعلالدالّةالعددُ المُعلَنُ للوسائط
GETعند_طلب_جلب(الخادم، المسار، "المعالِج")٣
POSTعند_طلب_إرسال(الخادم، المسار، "المعالِج")٣
PUTعند_طلب_استبدال(الخادم، المسار، "المعالِج")٣
DELETEعند_طلب_حذف(الخادم، المسار، "المعالِج")٣

الوصفة

sad
استورد شبكة

دالة اقرأ_المهام()
    عين_رد_جيسون("{\"المهام\":[]}")
نهاية

دالة أضف_مهمة()
    عين_حالة_الرد(201)
    عين_نص_الرد("أضيفت: " + بيانات_الطلب())
نهاية

دالة بدل_مهمة()
    عين_نص_الرد("بدلت المهمة على المسار " + وجهة_الطلب())
نهاية

دالة احذف_مهمة()
    عين_حالة_الرد(204)
نهاية

متغير الخادم = أنشئ_خادم(0)

عند_طلب_جلب(الخادم، "/tasks"، "اقرأ_المهام")
عند_طلب_إرسال(الخادم، "/tasks"، "أضف_مهمة")
عند_طلب_استبدال(الخادم، "/tasks"، "بدل_مهمة")
عند_طلب_حذف(الخادم، "/tasks"، "احذف_مهمة")

ابدأ_الاستماع(الخادم، 8733)
bash
sad-build مسارات.ص -o مسارات.exe
./مسارات.exe

والمقيسُ عليه بـcurl — أربعُ طرقاتٍ وأربعةُ أجوبة (حُذِفَت من كلِّ ردٍّ ترويستا Date وServer اختصارًا، وما عداهما منسوخٌ كما ظهر):

http
$ 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، والسببُ في قاعدةِ المعالِج.

مُرخَّص بموجب رخصة MIT