go-resty 通過其鏈?zhǔn)秸{(diào)用的API 請求,而無需編寫冗長的代碼。
該庫提供了多種擴(kuò)展插件,如 Logger、Retryer、JSONMarshaler 等,極大地提升了其擴(kuò)展能力。開發(fā)者可以根據(jù)需要選擇合適的插件來增強(qiáng)功能。
go-resty 在返回的 Response 中包含詳細(xì)的錯(cuò)誤信息,使得錯(cuò)誤排查和處理更加簡單。

使用 go-resty 需要引入第三方庫,而 Golang 自帶的 net/http 則不需要額外依賴。這可能會(huì)增加項(xiàng)目的復(fù)雜性。
由于 go-resty 是基于 net/http 封裝的,在某些情況下可能比直接使用 net/http 要慢一些。
與 go-resty 相比,net/http 返回的錯(cuò)誤信息不夠全面,這可能導(dǎo)致開發(fā)者在調(diào)試時(shí)遇到困難。
當(dāng)解析一個(gè)錯(cuò)誤的 URL 時(shí),net/http 會(huì)直接拋出 panic,而不是返回一個(gè)錯(cuò)誤信息,這可能導(dǎo)致程序崩潰。
package main
import (
"fmt"
"time"
"github.com/go-resty/resty/v2"
)
type User struct {
ID int json:"id"
Name string json:"name"
Email string json:"email"
}func main() {
client := resty.New() // 設(shè)置超時(shí)時(shí)間為 5 秒
client.SetTimeout(5 * time.Second) resp, err := client.R().
SetQueryParams(map[string]string{
"id": "1",
}).
SetHeader("Accept", "application/json").
Get("https://httpbin.org/get") if err != nil {
if restErr, ok := err.(*resty.TimeoutError); ok {
fmt.Println("請求超時(shí):", restErr)
} else {
fmt.Println("發(fā)送 GET 請求失敗:", err)
}
return
} var user User
err = resp.UnmarshalJSON(&user)
if err != nil {
fmt.Println("解析響應(yīng)失敗:", err)
return
}
}

package main
import (
"fmt"
"time"
"github.com/go-resty/resty/v2"
)
type User struct {
ID int json:"id"
Name string json:"name"
Email string json:"email"
}func main() {
client := resty.New() // 設(shè)置重試次數(shù)為 3,重試間隔為 1 秒
client.SetRetryCount(3).
SetRetryWaitTime(1 * time.Second) resp, err := client.R().
SetQueryParams(map[string]string{
"id": "1",
}).
SetHeader("Accept", "application/json").
Get("https://httpbin.org/get") if err != nil {
fmt.Println("發(fā)送 GET 請求失敗:", err)
return
} var user User
err = resp.UnmarshalJSON(&user)
if err != nil {
fmt.Println("解析響應(yīng)失敗:", err)
return
}
}
自動(dòng)重試機(jī)制通過設(shè)置重試次數(shù)和間隔時(shí)間,確保在網(wǎng)絡(luò)不穩(wěn)定的情況下提高請求成功率。

fmt.Println(resp)
}
func main() {
client := resty.New()
certFile := "/path/to/cert.pem"
keyFile := "/path/to/key.pem"
password := "secret"
err := client.SetCertificates(certFile, keyFile, password)
if err != nil {
fmt.Println("加載證書失敗:", err)
return
}
// 關(guān)閉證書校驗(yàn)
client.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})
resp, err := client.R().
SetHeader("Accept", "application/json").
Get("https://httpbin.org/get")
if err != nil {
fmt.Println("發(fā)送 GET 請求失敗:", err)
return
}
fmt.Println(resp)
}
通過設(shè)置 TLS 配置,go-resty 可以處理安全連接,確保數(shù)據(jù)的安全傳輸。

go-resty 使用 http.Transport 來實(shí)現(xiàn) HTTP 連接池,能夠有效管理連接數(shù)和超時(shí)時(shí)間,提高網(wǎng)絡(luò)請求的效率。
client := resty.New()
client.SetTransport(&http.Transport{
MaxIdleConnsPerHost: 10,
IdleConnTimeout: 30 * time.Second,
TLSHandshakeTimeout: 10 * time.Second,
ResponseHeaderTimeout: 20 * time.Second,
})
通過合理配置連接池參數(shù),可以顯著提高應(yīng)用程序的性能,減少請求延遲。

go-resty 可以通過代理發(fā)送 HTTP 請求,支持各種代理協(xié)議,包括 HTTP 和 SOCKS5。
func TestSend(t *testing.T){
client := resty.New()
proxyURL := "http://user:password@proxyhost:port"
client.SetProxy(proxyURL) resp, err := client.R().
SetHeader("Content-Type", "application/json").
SetBody(map[string]string{
"name": "John",
"email": "john@example.com",
}).
Post("https://httpbin.org/post")
if err != nil {
fmt.Println("Error:", err)
return
} fmt.Println("Status Code:", resp.StatusCode())
fmt.Println("Body:", resp.String())
}
設(shè)置代理參數(shù)可以有效解決網(wǎng)絡(luò)限制問題,確保請求的順利發(fā)送。

go-resty 支持多種認(rèn)證方式,包括基本認(rèn)證、NTLM 認(rèn)證和 Digest 認(rèn)證,幫助開發(fā)者處理多種安全需求。
// 基本認(rèn)證
proxyAuth := resty.ProxyBasicAuth("user", "password")
client.SetProxyAuth(proxyAuth)
// NTLM 認(rèn)證
proxyAuth := resty.ProxyNtlmAuth("domain", "user", "password")
client.SetProxyAuth(proxyAuth)// Digest 認(rèn)證
proxyAuth := resty.ProxyDigestAuth("user", "password")
client.SetProxyAuth(proxyAuth)
選擇合適的認(rèn)證方式可以提高應(yīng)用程序的安全性,保護(hù)敏感數(shù)據(jù)。

go-resty 是一個(gè)非常強(qiáng)大的 Golang HTTP 客戶端庫,其鏈?zhǔn)秸{(diào)用、豐富的功能和友好的擴(kuò)展性使得開發(fā) RESTful API 變得更加簡單高效。雖然需要引入第三方庫,可能帶來一定的性能損耗,但其提供的功能和便捷性使其成為優(yōu)秀的選擇。

問:go-resty 支持哪些認(rèn)證方式?
問:如何設(shè)置 go-resty 的超時(shí)?
client.SetTimeout(時(shí)間) 方法設(shè)置請求的超時(shí)時(shí)間。問:go-resty 可以使用代理嗎?
client.SetProxy(代理地址) 方法設(shè)置。問:如何在 go-resty 中處理重試機(jī)制?
client.SetRetryCount 和 client.SetRetryWaitTime 方法可以設(shè)置重試次數(shù)和重試間隔。問:有哪些 go-resty 的擴(kuò)展插件?