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)