نصب

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())
Output
اطلاعات پاسخ:
  خطا     : 
  کد وضعیت: 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")


// مثال استفاده از متد 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")

انواع مختلف درخواست 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")

// آپلود فایل به صورت آرایه بایت خام
fileBytes, _ := os.ReadFile("/Users/jeeva/mydocument.pdf")

// توجه: ما هیچگونه تنظیمی برای هدر نوع محتوا نمی‌کنیم زیرا go-resty به صورت خودکار Content-Type را تشخیص می‌دهد
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") // این متد نیز بارگذاری را از طریق 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: "Jeevanandam M",
        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)