نمط Middleware
تسلسل المعالجات للتسجيل والمصادقة
نمط Middleware درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
ما البرمجية الوسيطة؟
البرمجية الوسيطة هي دالة تغلّف http.Handler لإضافة سلوكيات مشتركة (التسجيل والمصادقة والاسترداد) من دون تعديل منطق الأعمال في المعالج.
توقيع البرمجية الوسيطة
البرمجية الوسيطة هي دالة تستقبل http.Handler وتُرجع http.Handler:
type Middleware func(http.Handler) http.Handlerبرمجية وسيطة بسيطة للتسجيل
سجّل كل طلب قبل تشغيل المعالج وبعده:
func Logger(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Printf("%s %s", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
log.Printf("done %s", r.URL.Path)
})
}تسلسل البرمجيات الوسيطة
طبّق طبقات متعددة من البرمجيات الوسيطة بتداخلها:
handler := Logger(Auth(RateLimit(myHandler)))
http.ListenAndServe(":8080", handler)دالة مساعدة لسلسلة البرمجيات الوسيطة
أنشئ دالة للسلسلة لتطبيق البرمجيات الوسيطة بالترتيب من دون تداخل عميق:
func Chain(h http.Handler, m ...Middleware) http.Handler {
for i := len(m)-1; i >= 0; i-- {
h = m[i](h)
}
return h
}
// Usage: Chain(myHandler, Logger, Auth, RateLimit)برمجية وسيطة للمصادقة
تحقق من المصادقة قبل استدعاء المعالج التالي. أعد الحالة 401 فورًا إذا كان الرمز مفقودًا أو غير صالح.
func Auth(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
token := r.Header.Get("Authorization")
if !isValid(token) {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
next.ServeHTTP(w, r)
})
}برمجية وسيطة لاسترداد حالات panic
التقط حالات panic الصادرة من المعالجات حتى لا يتعطل الخادم:
func Recovery(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
if err := recover(); err != nil {
log.Printf("panic: %v", err)
http.Error(w, "Internal Server Error", 500)
}
}()
next.ServeHTTP(w, r)
})
}تمرير البيانات عبر السياق
يمكن للبرمجية الوسيطة إرفاق بيانات بسياق الطلب لتستخدمها المعالجات اللاحقة:
ctx := context.WithValue(r.Context(), userKey, user)
next.ServeHTTP(w, r.WithContext(ctx))غلاف الاستجابة
التقط رمز الحالة الذي كتبه المعالج من خلال تغليف ResponseWriter:
type statusRecorder struct {
http.ResponseWriter
status int
}
func (r *statusRecorder) WriteHeader(code int) {
r.status = code
r.ResponseWriter.WriteHeader(code)
}الترتيب مهم
تُنفَّذ البرمجية الوسيطة بالترتيب الذي تغلّف به المعالج. ينبغي تشغيل المصادقة قبل تحديد معدل الطلبات، كما ينبغي أن يكون استرداد حالات panic في الطبقة الخارجية حتى يلتقط حالات panic الصادرة من البرمجيات الوسيطة الأخرى.
البرمجية الوسيطة لكل مسار مقابل العامة
طبّق البرمجيات الوسيطة العامة (التسجيل والاسترداد) على mux بالكامل. وطبّق البرمجيات الوسيطة الخاصة بالمسار (المصادقة وتحديد معدل الطلبات) على مجموعات مسارات محددة باستخدام موجّه فرعي أو غلاف للمعالج.
تحقق سريع
ما التوقيع الصحيح لبرمجية وسيطة HTTP في Go؟
مراجعة: نمط البرمجيات الوسيطة
النقاط الرئيسية:
- البرمجية الوسيطة: func(http.Handler) http.Handler
- أنشئ السلسلة بالتداخل؛ واستخدم دالة Chain المساعدة لزيادة الوضوح
- اجعل الاسترداد في الطبقة الخارجية، والمصادقة قبل منطق الأعمال
- مرّر البيانات إلى المعالجات اللاحقة عبر السياق
الأسئلة الشائعة
هل درس «نمط Middleware» مجاني؟
نعم — نص درس «نمط Middleware» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «نمط Middleware»؟
تسلسل المعالجات للتسجيل والمصادقة تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «نمط Middleware»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- إنشاء خادم HTTP
- التوجيه ومعاملات المسارات
- نمط Middleware
- الإيقاف السلس