Go Academy · درس

Middleware لـ CORS واستعادة ما بعد panic

سياسات المصادر المتقاطعة والتعافي من حالات panic

الدرس 4 من 413 خطوة

Middleware لـ CORS واستعادة ما بعد panic درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

ما المقصود بـ CORS؟

مشاركة الموارد بين المصادر (CORS) هي آلية أمان في المتصفح تقيّد المصادر التي يمكنها إرسال طلبات HTTP إلى واجهة API الخاصة بك. يفعّل الخادم ذلك من خلال تعيين ترويسات الاستجابة.

الطلب التمهيدي لـ CORS

قبل إرسال طلب بين المصادر يحتوي على ترويسة مخصصة أو طريقة غير بسيطة، يرسل المتصفح طلبًا تمهيديًا من نوع OPTIONS. يجب أن تتعامل البرمجية الوسيطة مع OPTIONS وأن تعيد 200 مع ترويسات CORS.

البرمجية الوسيطة لـ CORS

برمجية وسيطة بسيطة لـ CORS أثناء التطوير:

func CORS(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Access-Control-Allow-Origin", "https://myapp.com")
        w.Header().Set("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS")
        w.Header().Set("Access-Control-Allow-Headers", "Authorization,Content-Type")
        if r.Method == http.MethodOptions {
            w.WriteHeader(http.StatusOK); return
        }
        next.ServeHTTP(w, r)
    })
}

المصادر المسموح بها

لا تستخدم Access-Control-Allow-Origin: * عند استخدام بيانات الاعتماد (ملفات تعريف الارتباط أو ترويسات Authorization)، بل استخدم مصدرًا صريحًا. تحقّق من المصدر مقابل قائمة مسموح بها عند التعامل مع مصادر متعددة.

allowedOrigins := map[string]bool{
    "https://app.example.com": true,
    "https://dev.example.com": true,
}

if allowedOrigins[r.Header.Get("Origin")] {
    w.Header().Set("Access-Control-Allow-Origin", r.Header.Get("Origin"))
}

Access-Control-Allow-Credentials

السماح بإرسال ملفات تعريف الارتباط وترويسات التفويض بين المصادر:

w.Header().Set("Access-Control-Allow-Credentials", "true")

مكتبة rs/cors

استخدم مكتبة github.com/rs/cors للحصول على CORS مناسب لبيئات الإنتاج، مع مطابقة مرنة للمصادر ودعم بيانات الاعتماد وتخزين الطلبات التمهيدية مؤقتًا.

c := cors.New(cors.Options{
    AllowedOrigins: []string{"https://example.com"},
    AllowedMethods: []string{"GET","POST","PUT","DELETE"},
    AllowedHeaders: []string{"Authorization","Content-Type"},
    AllowCredentials: true,
})
handler := c.Handler(mux)

برمجية وسيطة للتعافي من panic

تعافَ من حالات panic لمنع الخادم من التعطل وفقدان جميع الاتصالات النشطة:

func Recovery(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        defer func() {
            if rec := recover(); rec != nil {
                log.Printf("panic: %v\n%s", rec, debug.Stack())
                http.Error(w, "Internal Server Error", 500)
            }
        }()
        next.ServeHTTP(w, r)
    })
}

runtime/debug.Stack

اطبع تتبّع مكدس goroutine الكامل عند حدوث panic للمساعدة في تشخيص السبب الجذري:

import "runtime/debug"
log.Printf("panic: %v\n%s", rec, debug.Stack())

دمج Sentry

أرسل حالات panic إلى Sentry أو إلى خدمات مشابهة لتتبّع الأخطاء داخل البرمجية الوسيطة للتعافي، قبل إعادة 500 إلى العميل.

الترتيب: التعافي في الخارج

سجّل Recovery دائمًا بوصفه البرمجية الوسيطة الخارجية، أي المطبّقة أولًا، حتى يلتقط حالات panic الصادرة عن جميع البرمجيات الوسيطة والمعالجات الأخرى.

handler := Recovery(RequestID(Logger(Auth(mux))))

اختبار التعافي من panic

اكتب معالجًا يتسبب في panic عمدًا، واستدعِه عبر البرمجية الوسيطة باستخدام httptest، وتحقّق من أن الاستجابة هي 500.

panicHandler := http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) { panic("test") })
w := httptest.NewRecorder()
Recovery(panicHandler).ServeHTTP(w, httptest.NewRequest("GET", "/", nil))
assert.Equal(t, 500, w.Code)

تحقق سريع

لماذا يجب أن تكون البرمجية الوسيطة للتعافي من panic في الطبقة الخارجية؟

مراجعة: CORS والتعافي من panic

النقاط الرئيسية:

  • CORS: عيّن ترويسات Access-Control-Allow-* وتعامل مع الطلب التمهيدي OPTIONS
  • Allow-Origin: استخدم مصدرًا صريحًا، وليس *، عند استخدام بيانات الاعتماد
  • التعافي: defer recover()، ثم تسجيل تتبّع المكدس، ثم إعادة 500
  • يجب أن تكون برمجية التعافي الوسيطة الخارجية
البدء مجانًا

تعلم Go مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
51
الدروس
203

الأسئلة الشائعة

هل درس «Middleware لـ CORS واستعادة ما بعد panic» مجاني؟

نعم — نص درس «Middleware لـ CORS واستعادة ما بعد panic» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «Middleware لـ CORS واستعادة ما بعد panic»؟

سياسات المصادر المتقاطعة والتعافي من حالات panic تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «Middleware لـ CORS واستعادة ما بعد panic»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات سلسلة Middleware لـ HTTP
  2. Middleware التسجيل ومعرّف الطلب
  3. Middleware المصادقة وتحديد معدل الطلبات
  4. Middleware لـ CORS واستعادة ما بعد panic
← العودة إلى Go Academy