Go Resty হলো RESTful API clients তৈরি করার জন্য Go ভাষার লাইব্রেরি। Go Resty ব্যবহার করে ডেভেলপাররা দ্রুত এবং দক্ষতাপূর্বক RESTful API clients তৈরি করতে পারেন। এই অধ্যায়টি Go Resty দিয়ে দ্রুত শুরু করা হয়েছে তা পরিচিত করা হবে।

Installation

require github.com/go-resty/resty/v2 v2.7.0

অথবা

go get github.com/go-resty/resty/v2

Resty Example

নিম্নলিখিত উদাহরণগুলি আপনাকে সহজভাবে resty লাইব্রেরি ব্যবহার করা শিখাবে।

// আপনার কোডে resty ইম্পোর্ট করুন এবং এটির মধ্যে 'resty' নামে সনাক্ত করুন।
import "github.com/go-resty/resty/v2"

Simple GET Request

// Resty client তৈরি করুন
client := resty.New()

resp, err := client.R().
    EnableTrace().
    Get("https://httpbin.org/get")

// রিসপন্স অবজেক্ট এক্সপ্লোর করুন
fmt.Println("Response Info:")
fmt.Println("  এরর      :", err)
fmt.Println("  স্ট্যাটাস কোড:", resp.StatusCode())
fmt.Println("  স্ট্যাটাস     :", resp.Status())
fmt.Println("  প্রটোকল   :", resp.Proto())
fmt.Println("  সময়       :", resp.Time())
fmt.Println("  Received at:", resp.ReceivedAt())
fmt.Println("  বডি       :\n", resp)
fmt.Println()

// ট্র্যাকিং তথ্য এক্সপ্লোর করুন
fmt.Println("Request trace info:")
ti := resp.Request.TraceInfo()
fmt.Println("  DNS lookup      :", ti.DNSLookup)
fmt.Println("  Connect time    :", ti.ConnTime)
fmt.Println("  TCP connect time:", ti.TCPConnTime)
fmt.Println("  TLS handshake   :", ti.TLSHandshake)
fmt.Println("  Server time     :", ti.ServerTime)
fmt.Println("  Response time   :", ti.ResponseTime)
fmt.Println("  Total time      :", ti.TotalTime)
fmt.Println("  Is conn reused  :", ti.IsConnReused)
fmt.Println("  Conn was idle   :", ti.IsConnWasIdle)
fmt.Println("  Conn idle time  :", ti.ConnIdleTime)
fmt.Println("  Request attempt :", ti.RequestAttempt)
fmt.Println("  Remote address  :", ti.RemoteAddr.String())
আউটপুট
রেসপন্স তথ্য:
  এরর      : 
  স্ট্যাটাস কোড: 200
  স্ট্যাটাস     : 200 OK
  প্রটোকল   : HTTP/2.0
  সময়       : 457.034718ms
  Received at: 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 lookup      : 4.074657ms
  Connect time    : 381.709936ms
  TCP connect time: 77.428048ms
  TLS handshake   : 299.623597ms
  Server time     : 75.414703ms
  Response time   : 79.337µs
  Total time      : 457.034718ms
  Is conn reused  : false
  Conn was idle   : false
  Conn idle time  : 0s
  Request attempt : 1
  Remote address  : 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")


// প্রয়োজন হলে, নির্দিষ্ট রিস্পন্স কন্টেন্ট টাইপটি জোরাং পার্স করার জন্য ইনষ্ট্রাক্ট রেস্টি
resp, err := client.R().
      SetResult(result).
      ForceContentType("application/json").
      Get("v2/alpine/manifests/latest")

বিভিন্ন POST অনুরোধের উদাহরণ

// একটি Resty ক্লায়েন্ট তৈরি করুন
client := resty.New()

// JSON স্ট্রিং পোস্ট করুন
// যদি ক্লায়েন্ট-স্তরের সেটিংস সেট করা হয়ে থাকে, তাহলে কন্টেন্ট টাইপ সেট করার দরকার নেই
resp, err := client.R().
      SetHeader("Content-Type", "application/json").
      SetBody(`{"username":"testuser", "password":"testpass"}`).
      SetResult(&AuthSuccess{}).    // অথবা SetResult(AuthSuccess{}).
      Post("https://myapp.com/login")

// []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")

// স্ট্রাক্ট পোস্ট করুন, ডিফল্টভাবে JSON কন্টেন্ট টাইপ, সেট করার দরকার নেই
resp, err := client.R().
      SetBody(User{Username: "testuser", Password: "testpass"}).
      SetResult(&AuthSuccess{}).    // অথবা SetResult(AuthSuccess{}).
      SetError(&AuthError{}).       // অথবা SetError(AuthError{}).
      Post("https://myapp.com/login")

// ম্যাপ পোস্ট করুন, ডিফল্টভাবে 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 এটি স্বয়ংক্রিয়ভাবে কন্টেন্ট-টাইপ নির্মাণ দেখবে
resp, err := client.R().
      SetBody(fileBytes).
      SetContentLength(true).          // ড্রপবক্স এই মানটি প্রয়োজন
      SetAuthToken("").
      SetError(&DropboxError{}).       // অথবা SetError(DropboxError{}).
      Post("https://content.dropboxapi.com/1/files_put/auto/resty/mydocument.pdf") // ড্রপবক্সও সমর্থন করে PUT মেথড আপলোড 

// নোটঃ যদি কন্টেন্ট টাইপ হেডার সেট না করা থাকে, তাহলে রেস্টি পোস্ট বডির কন্টেন্ট-টাইপ নির্মাণ দেখবে
//   * স্ট্রাক্ট এবং ম্যাপ ডেটা টাইপ এর জন্য, এটি ডিফল্টভাবে 'application/json'
//   * তারপর এটি সাধারণ টেক্সট কন্টেন্ট-টাইপ হয়

PUT এর অনুরোধ

আপনি যেকোনো কম্বিনেশন ব্যবহার করতে পারেন POST এর মতো স্থানান্তরিত হওয়া PUT পদক্ষেপটির জন্য।

// দ্রষ্টব্য: এটি পুট পদক্ষেপটি ব্যবহার করার একটি উদাহরণ, আরো কম্বিনেশনের জন্য দয়া করে পোস্ট দেখুন

// একটি Resty ক্লায়েন্ট তৈরি করুন
client := resty.New()

// JSON কন্টেন্ট টাইপে অনুরোধ প্ঠানি
// যদি ক্লায়েন্ট স্তরের সেটিংস থাকে, তবে এউটা ছাড়াই পরীক্ষা সমস্যা হতে পারে
resp, err := client.R().
      SetBody(Article{
        Title: "go-resty",
        Content: "এটি আমার নিবন্ধের বিষয়, ওহ হ্যাঁ!",
        Author: "Jeevanandam M",
        Tags: []string{"নিবন্ধ", "উদাহরণ", "resty"},
      }).
      SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD").
      SetError(&Error{}).       // অথবা SetError(Error{}).
      Put("https://myapp.com/article/1234")

প্যাচ এর অনুরোধ

আপনি যেকোনো কম্বিনেশন ব্যবহার করতে পারেন POST এর মতো স্থানান্তরিত হওয়া PUT পদক্ষেপটির জন্য।

// দ্রষ্টব্য: এটি প্যাচ পদক্ষেপটি ব্যবহার করার একটি উদাহরণ, আরো কম্বিনেশনের জন্য দয়া করে পোস্ট দেখুন

// একটি 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")

মুছে ফেলুন, হেড, বিকল্প অনুরোধ

// একটি 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)