مكتبة resty في Go: عميل HTTP قوي وأنيق
في عالم لغة Go، توجد العديد من المكتبات للتعامل مع طلبات HTTP. توفر الحزمة القياسية net/http وظائف أساسية، لكن المشاريع الحقيقية غالبًا ما تحتاج إلى شيء أكثر سهولة وثراءً بالميزات. مكتبة resty هي بالضبط ما يحتاجه المطورون الذين يقدرون البساطة، قراءة الكود الواضحة، والإمكانيات القوية "الجاهزة للاستخدام".
تُوصف resty بأنها "عميل REST API للغة Go، مستوحاة من مكتبة RestClient الخاصة بلغة Ruby". توفر واجهة fluent (سلاسل استدعاء)، معالجة تلقائية لـ JSON، آليات مدمجة لإعادة المحاولة، مهلات زمنية، middleware، وغيرها الكثير. بفضل بنيتها، تتيح resty كتابة كود موجز ومعبر للتفاعل مع أي خدمات HTTP — من طلبات GET البسيطة إلى تكاملات API المعقدة متعددة المراحل.
لماذا نستخدم resty بدلاً من net/http القياسية؟ أولاً، تقلل بشكل كبير من الكود المتكرر (boilerplate). لن تحتاج إلى إنشاء هياكل الطلبات يدويًا، تعيين الرؤوس، أو تحليل استجابات JSON. ثانيًا، توفر resty تجريدات مريحة للتعامل مع الكوكيز، المصادقة، البروكسي، ورفع الملفات. ثالثًا، المكتبة مدعومة بنشاط، ولها وثائق ممتازة، وتُستخدم في آلاف المشاريع الإنتاجية. هذا يجعل resty أحد أفضل الخيارات لعميل HTTP في نظام Go البيئي.
التثبيت
يتم تثبيت resty بالطريقة القياسية في Go — عبر مدير التبعيات go get:
go get -u github.com/go-resty/resty/v2
بعد تنفيذ هذا الأمر، ستُضاف المكتبة إلى ملف go.mod الخاص بك. تأكد من استخدام Go الإصدار 1.16 أو أحدث لدعم الوحدات (modules).
في الكود الخاص بك، سيكون الاستيراد على النحو التالي:
import "github.com/go-resty/resty/v2"
بداية سريعة
لنبدأ بمثال عملي بسيط — سنرسل طلب GET إلى API عام ونعرض النتيجة:
package main
import (
"fmt"
"github.com/go-resty/resty/v2"
)
func main() {
// إنشاء عميل
client := resty.New()
// تنفيذ طلب GET
resp, err := client.R().
SetHeader("Accept", "application/json").
Get("https://jsonplaceholder.typicode.com/posts/1")
if err != nil {
fmt.Println("خطأ:", err)
return
}
fmt.Println("الحالة:", resp.StatusCode())
fmt.Println("نص الاستجابة:", resp.String())
}
يوضح هذا المثال الميزة الأساسية لـ resty — واجهة fluent. نقوم بإنشاء عميل، ثم عبر الطريقة R() ننشئ طلبًا جديدًا، نضبط الرأس، وننفذ GET. جميع الاستدعاءات تتحد في سلسلة، مما يجعل الكود سهل القراءة للغاية.
الطرق والوظائف الأساسية
دعنا نستعرض 10 طرق رئيسية في resty تغطي 90% من جميع المهام عند العمل مع HTTP.
1. resty.New()
التوقيع: func New() *Client
الوظيفة: تنشئ مثيلًا جديدًا لعميل HTTP بالإعدادات الافتراضية. هذه هي نقطة البداية لجميع العمليات.
client := resty.New()
// الآن العميل جاهز للاستخدام
2. Client.R()
التوقيع: func (c *Client) R() *Request
الوظيفة: تنشئ كائن طلب جديد. جميع طرق ضبط الطلب (الرؤوس، الجسم، المعاملات) تُستدعى على هذا الكائن.
request := client.R()
request.SetHeader("Content-Type", "application/json")
// ... متابعة العمل مع الطلب
3. Request.Get(url)
التوقيع: func (r *Request) Get(url string) (*Response, error)
الوظيفة: تنفذ طلب HTTP GET إلى عنوان URL المحدد. تُرجع الاستجابة وأي خطأ.