شرح Go HTTP Middleware
توقف عن نسخ ولصق الكود نفسه في كل معالج (handler).
إذا كنت بحاجة إلى التحقق من المصادقة (authentication)، أو تسجيل مدة الطلب، أو إضافة معرف فريد (unique ID) لكل طلب، فلا تكتب هذا المنطق داخل معالجات الأعمال (business handlers) الخاصة بك. إذا كان لديك 20 معالجاً، فسيكون لديك 20 مكاناً تحتاج لتحديثه عندما يتغير منطق المصادقة. هذا كابوس من حيث الصيانة.
الـ Middleware يحل هذه المشكلة. تكتب المنطق مرة واحدة، ثم تقوم بتغليف (wrap) المعالجات الخاصة بك، ولن تضطر للمسها مرة أخرى.
ما هو الـ Middleware؟
في لغة Go، الـ middleware هو دالة تقوم بـ:
• تقبل http.Handler.
• تُرجع http.Handler جديداً.
• تنفذ إجراءات قبل أو بعد تشغيل المعالج الأصلي.
فكر فيه كالبصلة؛ كل طبقة تغلف الطبقة التي تليها. يمر الطلب عبر كل طبقة أثناء الدخول، وتمر الاستجابة عبر كل طبقة أثناء الخروج.
ما ستتعلمه:
• أساس واجهة http.Handler.
• كيفية بناء middleware مخصص من الصفر.
• كيفية ربط طبقات متعددة معاً.
• كيفية تمرير البيانات عبر السلسلة باستخدام context.
• نصائح متقدمة مثل الترتيب والتعافي من الـ panic.
النقاط الجوهرية:
• الترتيب مهم. إذا قام أحد الـ middleware بتعيين قيمة في الـ context ، فيجب أن يكون الـ middleware التالي في السلسلة هو من يقرأها. إذا قمت بتبديلهما، فستكون البيانات فارغة.
• قم دائماً بعمل return بعد الخروج المبكر. إذا وجدت خطأ وأرسلت http.Error ، فاستدعِ return فوراً. إذا استدعيت next.ServeHTTP بعد إرسال خطأ، فسيحدث panic في الخادم الخاص بك.
• استخدم أنواعاً مخصصة (custom types) لمفاتيح الـ context. لا تستخدم النصوص العادية (plain strings) كمفاتيح؛ فهذا يمنع الحزم (packages) المختلفة من الكتابة فوق بيانات بعضها البعض.
• استخدم غلافاً (wrapper) لالتقاط البيانات. بما أن http.ResponseWriter القياسي لا يسمح لك بقراءة رمز الحالة (status code) بعد كتابته، يجب عليك إنشاء struct مخصص لاعتراضه وحفظه في سجلاتك (logs).
ابنِ أساساً متيناً لخوادم Go HTTP الخاصة بك من خلال إتقان هذه الأنماط.
