عميل HTTP للغة Go (Golang): نظرة عامة ومقارنة لأفضل المكتبات
Go (Golang) هي واحدة من أشهر اللغات لإنشاء خدمات الويب عالية التحميل، والخدمات المصغرة، وتكاملات API. العمل مع طلبات HTTP هي مهمة أساسية لأي خلفية تقريبًا. في المكتبة القياسية للغة Go، توجد حزمة قوية net/http، ولكن للسيناريوهات المعقدة (إعادة المحاولة التلقائية، تجمعات الاتصالات، واجهة fluent سهلة الاستخدام) تم تطوير مكتبات متخصصة. في هذه المقالة، سنستعرض أفضل عملاء HTTP للغة Go: ميزاتهم، أداؤهم، وأمثلة على الاستخدام.
1. الحزمة القياسية net/http — الأساس المتين
حزمة net/http مدمجة في Go ولا تتطلب تثبيتًا. وهي تغطي الاحتياجات الأساسية بالكامل: إرسال طلبات GET/POST، العمل مع الرؤوس، الكوكيز، المهلات الزمنية. ومع ذلك، للاستخدام المتقدم (على سبيل المثال، تجمع اتصالات مع إعدادات)، يلزم تكوين يدوي لـ http.Transport.
package main
import ( "fmt" "io" "net/http" "time")
func main() { client := &http.Client{ Timeout: 10 * time.Second, Transport: &http.Transport{ MaxIdleConns: 100, IdleConnTimeout: 90 * time.Second, DisableCompression: false, }, }
resp, err := client.Get("https://api.github.com") if err != nil { panic(err) } defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body) fmt.Println("Status:", resp.StatusCode) fmt.Println("Body length:", len(body))}الإيجابيات: لا تبعيات، تحكم كامل، دعم HTTP/2، وسيطات مدمجة عبر أغلفة RoundTripper.
السلبيات: كود مطول للطلبات البسيطة، لا توجد واجهة fluent، صعوبة في إعداد إعادة المحاولة وإلغاء تسلسل JSON.
2. resty — عميل REST بسيط وأنيق
مكتبة resty (التثبيت: go get github.com/go-resty/resty/v2) هي واحدة من أشهر عملاء HTTP في Go. توفر واجهة fluent، وإلغاء تسلسل تلقائي لـ JSON/XML، وسلاسل استدعاء مريحة.
package main
import ( "fmt" "github.com/go-resty/resty/v2")
type User struct { ID int `json:"id"` Name string `json:"name"`}
func main() { client := resty.New() client.SetBaseURL("https://jsonplaceholder.typicode.com")
var users []User resp, err := client.R(). SetResult(&users). Get("/users")
if err != nil { panic(err) }
fmt.Println("Status:", resp.StatusCode()) fmt.Println("First user:", users[0].Name)}الإيجابيات: بناء جملة موجز، دعم مدمج لإعادة المحاولة، المهلات الزمنية، البروكسي، معالجة تلقائية للأخطاء، العمل مع multipart/form-data.
السلبيات: أبطأ قليلاً من net/http تحت الأحمال العالية (بسبب التجريدات)، لا يدعم HTTP/3.
3. grequests — نسخة Go من عميل Python الشهير
grequests (التثبيت: go get github.com/levigross/grequests) مستوحى من Python Requests. يوفر API بسيط لـ GET، POST، PUT، DELETE، ويدعم الجلسات، الكوكيز، والمعالجة التلقائية لـ JSON.
package main
import ( "fmt" "github.com/levigross/grequests")
func main() { resp, err := grequests.Get("https://httpbin.org/get", &grequests.RequestOptions{ Headers: map[string]string{"Accept": "application/json"}, }) if err != nil { panic(err) }
var data map[string]interface{} resp.JSON(&data) fmt.Println("URL:", data["url"])}الإيجابيات: كود بسيط، عمل مريح مع JSON، دعم تحميل الملفات.
السلبيات: المشروع
أيضاً في المكتبة
معالجة JSON في Node.js: دليل شامل
التعلم الآلي بلغة Go: نظرة عامة على المكتبات الخاصة بـ Golang
إرسال البريد الإلكتروني بلغة Rust: مكتبات lettre و mailparse للعمل مع البريد
أطر CLI لـ Go (Golang): نظرة شاملة على أدوات إنشاء تطبيقات وحدة التحكم