Go Resty هي مكتبة لغة Go لبناء عملاء API RESTful. باستخدام Go Resty ، يمكن للمطورين بناء عملاء API RESTful موثوق بهم بشكلٍ أسرع وأكثر كفاءة. يُقدم هذا الفصل كيفية البدء بسرعة مع Go Resty.
التثبيت
require github.com/go-resty/resty/v2 v2.7.0
أو
go get github.com/go-resty/resty/v2
مثال Resty
الأمثلة التالية ستساعدك في استخدام مكتبة resty بأكبر قدر من الراحة.
// استيراد مكتبة resty إلى كودك والإشارة إليها باسم `resty`.
import "github.com/go-resty/resty/v2"
طلب GET بسيط
// انشاء عميل Resty
client := resty.New()
resp, err := client.R().
EnableTrace().
Get("https://httpbin.org/get")
// استكشاف كائن الاستجابة
fmt.Println("معلومات الاستجابة:")
fmt.Println(" الخطأ :", err)
fmt.Println(" كود الحالة:", resp.StatusCode())
fmt.Println(" الحالة :", resp.Status())
fmt.Println(" البروتوكول:", resp.Proto())
fmt.Println(" الوقت :", resp.Time())
fmt.Println(" تم الاستلام في:", resp.ReceivedAt())
fmt.Println(" الجسم :\n", resp)
fmt.Println()
// استكشاف معلومات التتبع
fmt.Println("معلومات تتبع الطلب:")
ti := resp.Request.TraceInfo()
fmt.Println(" البحث عن DNS :", ti.DNSLookup)
fmt.Println(" وقت الاتصال :", ti.ConnTime)
fmt.Println(" وقت الاتصال بـ TCP:", ti.TCPConnTime)
fmt.Println(" مصافحة TLS :", ti.TLSHandshake)
fmt.Println(" وقت الخادم :", ti.ServerTime)
fmt.Println(" وقت الاستجابة :", ti.ResponseTime)
fmt.Println(" الوقت الإجمالي :", ti.TotalTime)
fmt.Println(" هل تم إعادة الاتصال :", ti.IsConnReused)
fmt.Println(" كان الاتصال غير نشط :", ti.IsConnWasIdle)
fmt.Println(" وقت الخمول للاتصال :", ti.ConnIdleTime)
fmt.Println(" محاولة الطلب :", ti.RequestAttempt)
fmt.Println(" عنوان البعيد :", ti.RemoteAddr.String())
النتيجة
معلومات الاستجابة:
الخطأ :
كود الحالة: 200
الحالة : 200 OK
البروتوكول: HTTP/2.0
الوقت : 457.034718ms
تم الاستلام في: 2020-09-14 15:35:29.784681 -0700 PDT m=+0.458137045
الجسم :
{
"args": {},
"headers": {
"Accept-Encoding": "gzip",
"Host": "httpbin.org",
"User-Agent": "go-resty/2.4.0 (https://github.com/go-resty/resty)",
"X-Amzn-Trace-Id": "Root=1-5f5ff031-000ff6292204aa6898e4de49"
},
"origin": "0.0.0.0",
"url": "https://httpbin.org/get"
}
معلومات تتبع الطلب:
البحث عن DNS : 4.074657ms
وقت الاتصال : 381.709936ms
وقت الاتصال بـ TCP: 77.428048ms
مصافحة TLS : 299.623597ms
وقت الخادم : 75.414703ms
وقت الاستجابة : 79.337µs
الوقت الإجمالي : 457.034718ms
هل تم إعادة الاتصال : false
كان الاتصال غير نشط : false
وقت الخمول للاتصال : 0s
محاولة الطلب : 1
عنوان البعيد : 3.221.81.55:443
طلب GET المعقد
// إنشاء عميل Resty
client := resty.New()
// تعيين معلمات الاستعلام
resp, err := client.R().
SetQueryParams(map[string]string{
"page_no": "1",
"limit": "20",
"sort":"name",
"order": "asc",
"random":strconv.FormatInt(time.Now().Unix(), 10),
}).
SetHeader("Accept", "application/json").
SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F").
Get("/search_result")
// Ex. استخدام طريقة Request.SetQueryString
resp, err := client.R().
SetQueryString("productId=232&template=fresh-sample&cat=resty&source=google&kw=buy a lot more").
SetHeader("Accept", "application/json").
SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F").
Get("/show_product")
// إذا لزم الأمر، فقوم بتحديد نوع محتوى الاستجابة المحدد لإرشاد Resty لتحليل الاستجابة JSON إلى هيكل البيانات
resp, err := client.R().
SetResult(result).
ForceContentType("application/json").
Get("v2/alpine/manifests/latest")
Beواقعات مختلفة لطلبات POST
// إنشاء عميل Resty
client := resty.New()
// POST السلسلة JSON
// إذا تم تعيين الإعدادات على مستوى العميل، لا يلزم تعيين نوع المحتوى
resp, err := client.R().
SetHeader("Content-Type", "application/json").
SetBody(`{"username":"testuser", "password":"testpass"}`).
SetResult(&AuthSuccess{}). // أو SetResult(AuthSuccess{}).
Post("https://myapp.com/login")
// POST []byte مصفوفة
// إذا تم تعيين الإعدادات على مستوى العميل، لا يلزم تعيين نوع المحتوى
resp, err := client.R().
SetHeader("Content-Type", "application/json").
SetBody([]byte(`{"username":"testuser", "password":"testpass"}`)).
SetResult(&AuthSuccess{}). // أو SetResult(AuthSuccess{}).
Post("https://myapp.com/login")
// POST ستركت معتمد على نوع المحتوى JSON بشكل افتراضي، لا يلزم تعيينه
resp, err := client.R().
SetBody(User{Username: "testuser", Password: "testpass"}).
SetResult(&AuthSuccess{}). // أو SetResult(AuthSuccess{}).
SetError(&AuthError{}). // أو SetError(AuthError{}).
Post("https://myapp.com/login")
// POST خريطة معتمدة على نوع المحتوى JSON بشكل افتراضي، لا يلزم تعيينه
resp, err := client.R().
SetBody(map[string]interface{}{"username": "testuser", "password": "testpass"}).
SetResult(&AuthSuccess{}). // أو SetResult(AuthSuccess{}).
SetError(&AuthError{}). // أو SetError(AuthError{}).
Post("https://myapp.com/login")
// تحميل ملف كمصفوفة بايتات نقية. مثال: تحميل ملف إلى Dropbox
fileBytes, _ := os.ReadFile("/Users/jeeva/mydocument.pdf")
// لاحظ أننا لا نقوم بتعيين رأس نوع المحتوى لأن go-resty سيكتشف تلقائيًا نوع المحتوى
resp, err := client.R().
SetBody(fileBytes).
SetContentLength(true). // Dropbox يتطلب هذا القيمة
SetAuthToken("").
SetError(&DropboxError{}). // أو SetError(DropboxError{}).
Post("https://content.dropboxapi.com/1/files_put/auto/resty/mydocument.pdf") // تدعم DropBox أيضًا عمليات التحميل بطريقة PUT
// ملاحظة: إذا لم يتم تعيين رأس نوع المحتوى، سيكتشف resty نوع المحتوى لجسم الطلب تلقائيًا
// * بالنسبة لأنواع البيانات struct و map، يعتمد افتراضيًا على 'application/json'
// * ثم يتبع ذلك نوع المحتوى النصي العادي
طلب PUT
يمكنك استخدام مجموعة متنوعة من استدعاء طريقة PUT
تمامًا كما هو موضح لـ POST
.
// ملاحظة: هذا مثال على استخدام طريقة PUT، للمزيد من الاختلافات يُرجى الرجوع إلى POST
// إنشاء عميل Resty
client := resty.New()
// إرسال الطلب بنوع المحتوى JSON
// إذا كانت هناك إعدادات على مستوى العميل، فيمكن تجاهل رمز المصادقة، ويمكن أن يكون ذلك مصدر لخطأ
resp, err := client.R().
SetBody(Article{
Title: "go-resty",
Content: "هذا محتوى مقالي، نعم!",
Author: "جيفانندام إم",
Tags: []string{"مقال", "مثال", "ريستي"},
}).
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
SetError(&Error{}). // أو SetError(Error{}).
Put("https://myapp.com/article/1234")
طلب PATCH
يمكنك استخدام مجموعة متنوعة من استدعاء طريقة PATCH
تمامًا كما هو موضح لـ POST
.
// ملاحظة: هذا مثال على استخدام طريقة PATCH، للمزيد من الاختلافات يُرجى الرجوع إلى POST
// إنشاء عميل Resty
client := resty.New()
// إرسال الطلب بنوع المحتوى JSON
// إذا كانت هناك إعدادات على مستوى العميل، فيمكن تجاهل رمز المصادقة، ويمكن أن يكون ذلك مصدر لخطأ
resp, err := client.R().
SetBody(Article{
Tags: []string{"وسم جديد 1", "وسم جديد 2"},
}).
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
SetError(&Error{}). // أو SetError(Error{}).
Patch("https://myapp.com/articles/1234")
طلبات DELETE
، HEAD
، OPTIONS
// إنشاء عميل Resty
client := resty.New()
// حذف مقال
// إذا كانت هناك إعدادات على مستوى العميل، فيمكن تجاهل رمز المصادقة، ويمكن أن يكون ذلك مصدر لخطأ
resp, err := client.R().
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
SetError(&Error{}). // أو SetError(Error{}).
Delete("https://myapp.com/articles/1234")
// حذف مقالات متعددة باستخدام سلسلة JSON كمحتوى/بيانات
// إذا كانت هناك إعدادات على مستوى العميل، فيمكن تجاهل رمز المصادقة، ويمكن أن يكون ذلك مصدر لخطأ
resp, err := client.R().
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
SetError(&Error{}). // أو SetError(Error{}).
SetHeader("Content-Type", "application/json").
SetBody(`{article_ids: [1002, 1006, 1007, 87683, 45432] }`).
Delete("https://myapp.com/articles")
// الحصول على معلومات الرأس لمورد
// إذا كانت هناك إعدادات على مستوى العميل، فيمكن تجاهل رمز المصادقة
resp, err := client.R().
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
Head("https://myapp.com/videos/hi-res-video")
// الحصول على معلومات الخيارات لمورد
// إذا كانت هناك إعدادات على مستوى العميل، فيمكن تجاهل رمز المصادقة
resp, err := client.R().
SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
Options("https://myapp.com/servers/nyc-dc-01")
إعداد عمليات التسلسل/التفسير للـ JSON و XML
يمكن للمستخدمين تسجيل مكتباتهم المفضلة للـ JSON/XML مع resty، أو كتابة مكتباتهم الخاصة. بشكل افتراضي، يقوم resty بتسجيل مكتبات encoding/json
و encoding/xml
القياسية.
// مثال على تسجيل json-iterator
import jsoniter "github.com/json-iterator/go"
json := jsoniter.ConfigCompatibleWithStandardLibrary
client := resty.New().
SetJSONMarshaler(json.Marshal).
SetJSONUnmarshaler(json.Unmarshal)
// بالمثل، يمكن للمستخدمين إعداد XML كما يلي -
client.SetXMLMarshaler(xml.Marshal).
SetXMLUnmarshaler(xml.Unmarshal)