AzLearn

أساسيات HTTP

HTTP Basics

مفهوم ~20 دقيقة

أساسيات HTTP — HTTP Basics

من أعظم نقاط قوة Go أن مكتبتها القياسية تحتوي على خادم HTTP إنتاجي — لا تحتاج Express أو Flask أو أي framework. حزمة net/http وحدها كافية لبناء خوادم تخدم ملايين الطلبات.

ملاحظة مهمة: أمثلة HTTP لا يمكن تشغيلها على Go Playground لأنها تحتاج شبكة. اقرأ الكود وافهمه، ثم جرّبه على جهازك المحلي.

أبسط خادم HTTP

main.go

واجهة http.Handler

كل شيء في net/http يدور حول هذه الواجهة:

type Handler interface {
    ServeHTTP(w http.ResponseWriter, r *http.Request)
}

http.HandleFunc هي اختصار مريح، لكن يمكنك تنفيذ الواجهة مباشرة:

main.go

فهم الطلب — http.Request

كائن http.Request يحتوي كل معلومات الطلب:

main.go

كتابة الاستجابة — http.ResponseWriter

main.go

التوجيه — Routing (Go 1.22+)

منذ Go 1.22، المُوجّه الافتراضي يدعم أنماطاً أقوى:

mux := http.NewServeMux()

// أنماط Go 1.22+ — Go 1.22+ patterns
mux.HandleFunc("GET /api/users", listUsers)        // GET فقط
mux.HandleFunc("POST /api/users", createUser)       // POST فقط
mux.HandleFunc("GET /api/users/{id}", getUser)      // مع متغير في المسار
mux.HandleFunc("DELETE /api/users/{id}", deleteUser)

// قراءة المتغير — Read path variable
func getUser(w http.ResponseWriter, r *http.Request) {
    id := r.PathValue("id")
    // ...
}

ملقم الملفات الثابتة — Static File Server

// خدمة ملفات من مجلد — Serve files from directory
fs := http.FileServer(http.Dir("./static"))
http.Handle("/static/", http.StripPrefix("/static/", fs))

أخطاء شائعة

خطأ 1: كتابة الترويسات بعد الجسم

// ❌ خطأ — الترويسة بعد الكتابة لا تعمل
fmt.Fprint(w, "data")
w.Header().Set("X-Custom", "value") // متأخر جداً!

// ✅ صحيح — الترويسة قبل الكتابة
w.Header().Set("X-Custom", "value")
fmt.Fprint(w, "data")

خطأ 2: نسيان return بعد الخطأ

// ❌ يكمل التنفيذ بعد الخطأ
if err != nil {
    http.Error(w, "خطأ", 500)
    // الكود يستمر!
}

// ✅ أضف return
if err != nil {
    http.Error(w, "خطأ", 500)
    return
}
تحدي — Challenge