0Pricing
Go Academy · درس

السياق في استدعاءات HTTP وقواعد البيانات

تمرير السياق عبر سلسلة الاستدعاءات

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

عميل HTTP مع السياق

مرّروا سياقًا إلى طلب HTTP صادر باستخدام req.WithContext(ctx). يُلغى الطلب إذا أُلغي السياق قبل وصول الاستجابة.

req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)
resp, err := http.DefaultClient.Do(req)
if err != nil {
    if errors.Is(err, context.DeadlineExceeded) {
        // timeout
    }
}

http.NewRequestWithContext

فضّلوا http.NewRequestWithContext ‏(في Go 1.13 وما بعده) على إنشاء طلب ثم استدعاء WithContext؛ فهذا أوضح ويتجنب تخصيصًا وسيطًا.

إلغاء طلب HTTP

أنشئوا سياقًا قابلًا للإلغاء باستخدام WithCancel، ومرّروه إلى الطلب، ثم استدعوا cancel عند الانتهاء أو عند حدوث خطأ. يُنهي العميل اتصال TCP.

ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)

database/sql مع السياق

تحتوي جميع أساليب database/sql على نظائر *Context: ‏QueryContext وExecContext وPrepareContext. وتلغي هذه الأساليب الاستعلام عند انتهاء السياق.

rows, err := db.QueryContext(ctx, "SELECT id FROM users WHERE active = $1", true)
if err != nil { return err }
defer rows.Close()

فحص السياق قبل الاستعلام

افحصوا السياق قبل بدء استعلام طويل، لإيقاف التنفيذ فورًا إذا كان الطلب قد أُلغي بالفعل.

if err := ctx.Err(); err != nil {
    return err // context already done
}
rows, err := db.QueryContext(ctx, ...)

السياق وتجميع الاتصالات

عند إلغاء السياق أثناء الاستعلام، تضع database/sql علامة على الاتصال باعتباره غير صالح إذا كان برنامج التشغيل يدعم ذلك، مما يمنع إعادة اتصال متضرر إلى التجميع.

gRPC والسياق

يستخدم gRPC السياق لتمرير المهلة الزمنية. يضبط العميل مهلة زمنية للسياق، ويفحصها الخادم عند كل عملية استقبال من الدفق. كما تُمرَّر البيانات الوصفية عبر السياق.

resp, err := client.GetUser(ctx, &pb.GetUserRequest{Id: id})

سياق الطلب الوارد

يرفق خادم HTTP سياقًا بكل طلب وارد عبر r.Context(). ويُلغى هذا السياق عند انقطاع اتصال العميل.

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    result, err := db.QueryContext(ctx, query)
}

السياق في سلاسل البرمجيات الوسيطة

تثري البرمجيات الوسيطة سياق الطلب بالمهلات الزمنية أو بيانات المصادقة أو معرّفات التتبّع، ثم تمرّر الطلب المُثرى إلى المعالج التالي.

تمرير السياق عبر استدعاءات الخدمات

في بنية الخدمات المصغّرة، ينبغي حقن معرّف التتبّع من سياق الطلب الوارد في جميع ترويسات HTTP وRPC الصادرة، حتى يعمل التتبّع الموزّع من البداية إلى النهاية.

الاختبار باستخدام السياق

في الاختبارات، استخدموا context.Background() أو context.WithTimeout لمنع تسرّب goroutines بين حالات الاختبار.

اختبار سريع

ما الدالة التي تنشئ طلب HTTP مرفقًا بسياق؟

مراجعة: السياق في HTTP وDB

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

  • استخدموا http.NewRequestWithContext لاستدعاءات HTTP الصادرة
  • تلغي أساليب *Context في database/sql الاستعلامات عند انتهاء السياق
  • استخدموا r.Context() مع الطلبات الواردة؛ ويُلغى عند انقطاع اتصال العميل
  • مرّروا السياق، ومعرّف التتبّع، عبر جميع الاستدعاءات اللاحقة

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

هل درس «السياق في استدعاءات HTTP وقواعد البيانات» مجاني؟

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

ماذا ستتعلم في «السياق في استدعاءات HTTP وقواعد البيانات»؟

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

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

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

كم من الوقت يستغرق درس «السياق في استدعاءات HTTP وقواعد البيانات»؟

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

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

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

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

  1. لماذا يوجد context.Context؟
  2. ‏WithCancel وWithTimeout
  3. ‏WithDeadline وWithValue
  4. السياق في استدعاءات HTTP وقواعد البيانات
← العودة إلى Go Academy