الفصل 29: تطوير الويب
مقدمة
لغة ص تدعم بناء خوادم ويب كاملة عبر مكتبة شبكة. هذا الفصل يغطي بناء خوادم HTTP وAPIs وخدمات الويب.
خادم ويب بسيط
sad
استورد خادم_هتتب من "شبكة"
متغير خادم = جديد خادم_هتتب(8080)
خادم.عند("/") = دالة(طلب، رد)
رد.ارسل_هتمل("<h1>مرحباً من لغة ص!</h1>")
نهاية
خادم.عند("/api/مستخدمين") = دالة(طلب، رد)
متغير بيانات = [
{"اسم": "أحمد"، "عمر": 25}،
{"اسم": "سارة"، "عمر": 22}
]
رد.ارسل_جسون(بيانات)
نهاية
اطبع_سطر("الخادم يعمل: http://localhost:8080")
خادم.ابدأ()خادم REST API كامل
sad
استورد خادم_هتتب من "شبكة"
استورد جسون من "جسون"
# قاعدة بيانات بسيطة في الذاكرة
متغير الطلاب = [
{"معرف": 1، "اسم": "أحمد"، "معدل": 3.8}،
{"معرف": 2، "اسم": "سارة"، "معدل": 3.9}
]
متغير التالي = 3
متغير خادم = جديد خادم_هتتب(3000)
# جلب جميع الطلاب
خادم.عند_جلب("/api/طلاب") = دالة(طلب، رد)
رد.ارسل_جسون(الطلاب)
نهاية
# جلب طالب بالمعرف
خادم.عند_جلب("/api/طلاب/:id") = دالة(طلب، رد)
متغير معرف = عدد(طلب.متغيرات["id"])
متغير طالب = لاشيء
لكل م في الطلاب
إذا (م["معرف"] == معرف)
طالب = م
نهاية
نهاية
إذا (طالب == لاشيء)
رد.الحالة = 404
رد.ارسل_جسون({"خطأ": "لم يوجد"})
وإلا
رد.ارسل_جسون(طالب)
نهاية
نهاية
# إضافة طالب جديد
خادم.عند_نشر("/api/طلاب") = دالة(طلب، رد)
متغير جديد_طالب = جسون.فك(طلب.الجسم)
جديد_طالب["معرف"] = التالي
التالي = التالي + 1
الطلاب = الطلاب + [جديد_طالب]
رد.الحالة = 201
رد.ارسل_جسون(جديد_طالب)
نهاية
اطبع_سطر("خادم الطلاب: http://localhost:3000")
خادم.ابدأ()الوسيطة (Middleware)
sad
استورد خادم_هتتب من "شبكة"
متغير خادم = جديد خادم_هتتب(8080)
# وسيطة تسجيل
خادم.استخدم = دالة(طلب، رد، تالي)
اطبع_سطر(طلب.الطريقة + " " + طلب.المسار)
تالي()
نهاية
# وسيطة المصادقة
خادم.استخدم = دالة(طلب، رد، تالي)
متغير رمز = طلب.رؤوس["تفويض"]
إذا (رمز == لاشيء أو رمز != "رمز-سري")
رد.الحالة = 401
رد.ارسل_جسون({"خطأ": "غير مصرح"})
وإلا
تالي()
نهاية
نهايةتقديم ملفات ثابتة
sad
استورد خادم_هتتب من "شبكة"
متغير خادم = جديد خادم_هتتب(8080)
# تقديم مجلد ثابت
خادم.ملفات_ثابتة("./عام")
خادم.ابدأ()جدول طرق HTTP
| الطريقة | الاستخدام | مثال |
|---|---|---|
| GET | جلب بيانات | عند_جلب("/api/عناصر") |
| POST | إضافة | عند_نشر("/api/عناصر") |
| PUT | تحديث | عند_تحديث("/api/:id") |
| DELETE | حذف | عند_حذف("/api/:id") |
تمرين
أنشئ API كاملاً لإدارة قائمة مهام (TODO) يدعم:
GET /api/مهام— جلب كل المهامPOST /api/مهام— إضافة مهمةPUT /api/مهام/:id— تحديث مهمةDELETE /api/مهام/:id— حذف مهمة