Go Resty เป็นไลบรารีของภาษา Go สำหรับการสร้างไคลเอ็นต์ RESTful API ด้วย Go Resty นักพัฒนาสามารถสร้างไคลเอ็นต์ RESTful API ที่เชื่อถือได้ได้อย่างรวดเร็วและมีประสิทธิภาพมากขึ้น บทนี้จะแนะนำวิธีการเริ่มต้นกับ 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())
Output
ข้อมูลการตอบกลับ:
  ข้อผิดพลาด      : 
  สถานะโค้ด     : 200
  สถานะ      : 200 OK
  โพรโตคอล   : HTTP/2.0
  เวลา     : 457.034718มิลลิวินาที
  ได้รับที่: 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.074657มิลลิวินาที
  เชื่อมต่อเวลา    : 381.709936มิลลิวินาที
  เชื่อมต่อ TCP   : 77.428048มิลลิวินาที
  การรับรอง TLS   : 299.623597มิลลิวินาที
  เวลาเซิร์ฟเวอร์     : 75.414703มิลลิวินาที
  เวลาตอบกลับ   : 79.337µs
  เวลาทั้งหมด     : 457.034718มิลลิวินาที
  ใช้การเชื่อมต่อซ้ำ  : false
  เชื่อมต่อได้ว่าง   : false
  เวลาว่างของเชื่อมต่อ  : 0วินาที
  พยายามคำขอ   : 1
  ที่อยู่ระยะไกล  : 3.221.81.55:443

คำขอ GET ที่ซับซ้อน

// สร้าง client ของ 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")


// หากจำเป็นต้องบังคับประเภทเนื้อหาการตอบกลับที่ระบบจะใช้เมธอด Parse JSON เป็นแบบไข้ของคุณ
resp, err := client.R().
      SetResult(result).
      ForceContentType("application/json").
      Get("v2/alpine/manifests/latest")

ตัวอย่างคำขอ POST ต่าง ๆ

// สร้าง client ของ 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")

// โพสต์ struct โดยค่าเริ่มต้นเป็น JSON content type ไม่จำเป็นต้องกำหนด
resp, err := client.R().
      SetBody(User{Username: "testuser", Password: "testpass"}).
      SetResult(&AuthSuccess{}).    // หรือ SetResult(AuthSuccess{}).
      SetError(&AuthError{}).       // หรือ SetError(AuthError{}).
      Post("https://myapp.com/login")

// โพสต์ map โดยค่าเริ่มต้นเป็น JSON content type ไม่จำเป็นต้องกำหนด
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")

// อัพโหลดไฟล์เป็นอาร์เรย์ไบต์แบบ raw ตัวอย่าง: อัพโหลดไฟล์ไปยัง Dropbox
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") // Dropbox รองรับการอัพโหลดด้วยวิธี PUT
// โปรดทราบ: หากไม่ได้กำหนดหัวเรื่องประเภทเนื้อหา resty จะตรวจจับ Content-Type ของร่างของของคำขอ
//   * สำหรับข้อมูลประเภท struct และ map มีค่าเริ่มต้นเป็น 'application/json'
//   * จากนั้นเป็นประเภทเนื้อหาข้อความปกติ

คำขอ PUT

คุณสามารถใช้การเรียกใช้เมธอด PUT ในรูปแบบที่แตกต่างกันได้เช่นเดียวกับที่ได้แสดงในการใช้เมธอด POST

// หมายเหตุ: นี่คือตัวอย่างการใช้เมธอด PUT สำหรับการใช้รูปแบบที่แตกต่างเพิ่มเติมโปรดอ้างอิงที่ POST

// สร้างไคลเอ็นต์ Resty
client := resty.New()

// ส่งคำขอพร้อม JSON content type
// หากมีการตั้งค่าระดับไคลเอ็นต์, การให้โทเคนการตรวจสอบสามารถไม่ต้องระบุ
resp, err := client.R().
      SetBody(Article{
        Title: "go-resty",
        Content: "นี่คือเนื้อหาบทความของฉัน โอ้ย!",
        Author: "Jeevanandam M",
        Tags: []string{"article", "example", "resty"},
      }).
      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 content type
// หากมีการตั้งค่าระดับไคลเอ็นต์, การให้โทเคนการตรวจสอบสามารถไม่ต้องระบุ
resp, err := client.R().
      SetBody(Article{
        Tags: []string{"new tag 1", "new tag 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 string เป็น payload/content
// หากมีการตั้งค่าระดับไคลเอ็นต์, การให้โทเคนการตรวจสอบสามารถไม่ต้องระบุ
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)