ServeMux Patterns
أنماط توجيه الميثود والمسار في ServeMux ServeMux Patterns
منذ Go 1.22، تدعم أنماط http.ServeMux مطابقة الميثود والـ wildcards داخل النمط نفسه، فتنتهي الحاجة لفحص r.Method أو تقطيع المسار يدويًا.
قبل Go 1.22 كان نمط ServeMux مجرّد مسار بلا ميثود، فيضطرّ كل معالج لفحص r.Method يدويًا بالداخل لو أراد التفريق بين GET وPOST لنفس المسار. النمط الحديث يكتب الميثود قبل المسار مباشرة، مثل "GET /items/{id}"، فيصبح التمييز بين الميثودات جزءًا من التوجيه نفسه لا من منطق المعالج.
إضافة لذلك، {name} يطابق جزءًا واحدًا من المسار، و{name...} (بثلاث نقاط) يطابق كل ما تبقّى من المسار كنص واحد، و{$} يفرض تطابقًا تامًا لنهاية المسار بدل التطابق الضمني مع كل ما تحته. لو نمطان قد يطابقان نفس الطلب، Go يختار الأخصّ تلقائيًا؛ ولو كانا متساويين بالعمومية بلا أفضلية واضحة، يفزع ServeMux (panic) وقت تسجيل المسارات لا وقت وصول الطلب.
الصياغة
mux.HandleFunc("GET /items/{id}", handler)
mux.HandleFunc("POST /items", handler)
mux.HandleFunc("/static/{path...}", handler)
mux.HandleFunc("/{$}", handler)📄 مثال
mux := http.NewServeMux()
mux.HandleFunc("GET /items/{id}", func(w http.ResponseWriter, r *http.Request) {
id := r.PathValue("id")
fmt.Fprintf(w, "العنصر رقم %s", id)
})
mux.HandleFunc("POST /items", createItem)
http.ListenAndServe(":8080", mux)أهم النقاط
| العنصر | الوظيفة |
|---|---|
| "GET /items/{id}" | يقيّد النمط بميثود GET، و{id} يطابق جزءًا واحدًا من المسار |
| "{name...}" | wildcard يلتقط بقية المسار كاملة كنص واحد |
| "{$}" | يفرض تطابقًا تامًا لنهاية المسار، يمنع التطابق الضمني مع الفروع تحته |
💡 نصائح عملية
- استخدم "/{$}" مع المسار الجذر لو تريد أن يطابق الصفحة الرئيسية فقط بالضبط لا كل شيء تحتها
- طلب بميثود غير مسجَّل لنفس المسار يُرجعه Go تلقائيًا بردّ 405 Method Not Allowed دون أي كود إضافي منك
⚠️ أخطاء شائعة
- نسيان أن نمطًا بلا ميثود محدَّد (مثل "/items") يطابق كل الميثودات، فيحتاج فحص r.Method يدويًا بالداخل خلافًا لنمط "GET /items"
- تسجيل نمطين متداخلين بلا أفضلية واضحة بينهما (لا أحدهما أخصّ من الآخر) يسبّب panic وقت تسجيل المسارات لا وقت الطلب
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار GO الكامل بالعربي.