أساسيات HTTP
HTTP Basics
مفهوم
~20 دقيقة
أساسيات HTTP — HTTP Basics
من أعظم نقاط قوة Go أن مكتبتها القياسية تحتوي على خادم HTTP إنتاجي — لا تحتاج Express أو Flask أو أي framework. حزمة net/http وحدها كافية لبناء خوادم تخدم ملايين الطلبات.
ملاحظة مهمة: أمثلة HTTP لا يمكن تشغيلها على Go Playground لأنها تحتاج شبكة. اقرأ الكود وافهمه، ثم جرّبه على جهازك المحلي.
أبسط خادم HTTP
main.go
Output:
واجهة http.Handler
كل شيء في net/http يدور حول هذه الواجهة:
type Handler interface {
ServeHTTP(w http.ResponseWriter, r *http.Request)
}
http.HandleFunc هي اختصار مريح، لكن يمكنك تنفيذ الواجهة مباشرة:
main.go
Output:
فهم الطلب — http.Request
كائن http.Request يحتوي كل معلومات الطلب:
main.go
Output:
كتابة الاستجابة — http.ResponseWriter
main.go
Output:
التوجيه — 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
أنشئ دالة تطبع معلومات عن نوع الاستجابة حسب المسار