resty是 Go 語言的一個 HTTP client 庫。resty功能十分強大,特性豐富,并提供了簡單易用的 API。
詳情請到 官方文檔地址https://github.com/go-resty/resty
// step1: 打開 go.mod文件 ==================================
// 加入一下 引用
require github.com/go-resty/resty/v2 v2.7.0
// step2: 打開main.go文件 ==================================
package main
import (
"fmt"
// 加入 指定版本的 引用
"github.com/go-resty/resty/v2"
)
func main() {client := resty.New()
resp, err := client.R().Get("https://httpbin.org/get")
fmt.Println(" Status :", resp.Status())
}
// step3: 下載包 ==================================
go mod tidy
一般使用
客戶端調(diào)用一個resty.New() 創(chuàng)建一個client對象(客戶端)
client := resty.New()
// Enable debug mode
client.SetDebug(true)
client.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true })
client.SetTimeout(1 * time.Minute)
client := resty.New()
client.SetBaseURL("https://whero.com")
resp, err := client.R().Get("/s/user")
請求方法
Get調(diào)用client對象的R() 方法創(chuàng)建一個請求對象;
// Create a Resty Client
client := resty.New()
resp, err := client.R().
SetQueryParams(map[string]string{ "age": "13",
"name": "tom",
}).Get("/search_result")
client.R().
SetPathParams(map[string]string{"age": "12",
"name": "tom",
}).
Get("/users/{age}/{name}")
client := resty.New()
// 讓get請求攜帶請求體參數(shù)需要額外配置
client.SetAllowGetMethodPayload(true)
resp, err := client.R().
SetBody(`{"username":"testuser", "password":"testpass"}`).
Get("/search_result")
Post// Create a Resty Client
client := resty.New()
// POST JSON string
resp, err := client.R().
SetHeader("Content-Type", "application/json").
// 請求體
SetBody(`{"username":"testuser", "password":"testpass"}`).
Post("https:")
// POST []byte array
SetBody([]byte(`{"username":"testuser", "password":"testpass"}`))
// POST Struct, default is JSON content type. No need to set one
SetBody(User{Username: "testuser", Password: "testpass"}).
// POST Map, default is JSON content type. No need to set one
SetBody(map[string]interface{}{"username": "testuser", "password": "testpass"}).
resp, err := client.R().
SetFormData(map[string]string{"access_token": "BC594900-518B-4F7E-AC75-BD37F019E08F",
}).
Post("")
// Create a Resty Client
client := resty.New()
// Request goes as JSON content type
// No need to set auth token, error, if you have client level settings
resp, err := client.R().
SetBody(Article{Title: "go-resty",
}).
Put("")
Deleteresp, err := client.R().
Delete("")
響應(yīng)體resp, _ := client.R().Get("https://baidu.com")
fmt.Println("Status Code:", resp.StatusCode()) // 狀態(tài)碼,如 200;
fmt.Println("Status:", resp.Status()) // 狀態(tài)碼和狀態(tài)信息,如 200 OK;
fmt.Println("Proto:", resp.Proto()) // 協(xié)議,如 HTTP/1.1;
fmt.Println("Time:", resp.Time()) // 從發(fā)送請求到收到響應(yīng)的時間;
fmt.Println("Received At:", resp.ReceivedAt()) // 接收到響應(yīng)的時刻;
fmt.Println("Size:", resp.Size()) // 響應(yīng)大小;
fmt.Println("Headers:", resp.Header()) // 響應(yīng)首部信息,以http.Header類型返回,即map[string][]string;
for key, value := range resp.Header() {fmt.Println(key, "=", value)
}
fmt.Println("Cookies:", resp.Cookies()) // 服務(wù)器通過Set-Cookie首部設(shè)置的 cookie 信息。
for i, cookie := range resp.Cookies() {fmt.Printf("cookie%d: name:%s value:%s\n", i, cookie.Name, cookie.Value)
}
type Man struct {Name string
Age int64
}
func main() {client := resty.New()
tom := &Man{}
client.R().SetResult(tom). // 通過 SetResult 方法 將數(shù)據(jù)反射到 結(jié)構(gòu)體 上。
Get("")
}
一般請求下,resty會根據(jù)響應(yīng)中的Content-Type來推斷數(shù)據(jù)格式。但是有時候響應(yīng)中無Content-Type首部或與內(nèi)容格式不一致,
我們可以通過調(diào)用請求對象的 ForceContentType()強制
讓resty按照特定的格式
來 解析響應(yīng):
client.R().
SetResult(tom).
ForceContentType("application/json").
Get("")
請求頭client.R().
SetHeader("Content-Type", "application/json").
SetHeader("aaa", "bbb").
Get("")
client.SetHeaders(map[string]string{"Content-Type": "application/json",
"aaa": "bbb",
})
client.R().
SetBody(User{Name:"dj"}).
SetContentLength(true).
Get("")
上下文件
上傳文件file1, _ := ioutil.ReadFile("./static/aaa.png")
file2, _ := ioutil.ReadFile("./static/bbb.png")
client := resty.New()
client.R().
SetFileReader("file_one", file1).
SetFileReader("file_two", file2).
SetFormData(map[string]string{"name": "tom",
"age": "11",
})
Post("")
client := resty.New()
client.R().
SetFile("file_one", "./static/aaa.png").
SetFile("file_two", "./static/bbb.png").
SetFiles(map[string]string{"file1": "./static/aaa.png",
"file2": "./static/bbb.png",
}).
SetFormData(map[string]string{"name": "tom",
"age": "11",
})
Post("")
下載文件client := resty.New()
// 如果該目錄 不存在 則會 自動創(chuàng)建
client.SetOutDirectory("/home/hero")
// 使用相對路徑, 相對SetOutDirectory 設(shè)置的路徑
client.R().
SetOutput("static/aaa.png").
Get("")
// 也可以使用絕對路徑
client.R().
SetOutput("/home/hero/static/aaa.png").
Get("")
高級應(yīng)用
中間件Resty 提供了和Gin類似的中間件特性。 OnBeforeRequest 和 OnAfterResponse 回調(diào)方法,可以在請求之前和響應(yīng)之后加入自定義邏輯。參數(shù)包含了 resty.Client 和當(dāng)前請求的 resty.Request 對象。成功時返回 nil ,失敗時返回 error 對象。
client := resty.New()
client.OnBeforeRequest(func(c *resty.Client, req *resty.Request) error {return nil
})
client.OnAfterResponse(func(c *resty.Client, resp *resty.Response) error {return nil
})
請求重試由于網(wǎng)絡(luò)抖動
帶來的接口穩(wěn)定性的問題 Resty 提供了重試功能來解決。SetRetryCount
設(shè)置重試次數(shù),SetRetryWaitTime
和SetRetryMaxWaitTime
設(shè)置等待時間。SetRetryAfter
是一個重試后的回調(diào)方法。除此之外還可以調(diào)用AddRetryCondition
設(shè)置重試的條件。
client := resty.New()
client.
SetRetryCount(3).
SetRetryWaitTime(5 * time.Second).
SetRetryMaxWaitTime(20 * time.Second).
SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) {return 0, errors.New("quota exceeded")
})
client.AddRetryCondition(
func(r *resty.Response) (bool, error) {return r.StatusCode() == http.StatusTooManyRequests
},
)
代理Resty 提供了 SetProxy 方法為請求添加代理,還可以調(diào)用 RemoveProxy 移除代理。
client := resty.New()
client.SetProxy("http://proxyserver:1234")
client.RemoveProxy()
debug模式Go1.7 引入了HTTP trace,可以在HTTP客戶端請求過程中收集一些更細(xì)粒度的信息,httptrace包提供了HTTP trace的支持,收集的信息可用于調(diào)試延遲問題,服務(wù)監(jiān)控,編寫自適應(yīng)系統(tǒng)等。httptrace包提供了許多鉤子,在HTTP往返期間收集各種事件的信息,包括連接的創(chuàng)建、復(fù)用、DNS解析查詢、寫入請求和讀取響應(yīng)。
resty提供的一個輔助功能:trace, 就是基于 httptrace包。我們在請求對象上調(diào)用EnableTrace
()方法啟用 trace。啟用 trace 可以記錄請求的每一步的耗時和其他信息。
resp, err :=client.R().EnableTrace().Get("https://baidu.com")
ti := resp.Request.TraceInfo()
fmt.Println("DNSLookup:", ti.DNSLookup) // DNS 查詢時間,如果提供的是一個域名而非 IP,就需要向 DNS 系統(tǒng)查詢對應(yīng) IP 才能進行后續(xù)操作;
fmt.Println("ConnTime:", ti.ConnTime) // 獲取一個連接的耗時,可能從連接池獲取,也可能新建;
fmt.Println("TCPConnTime:", ti.TCPConnTime) // TCP 連接耗時,從 DNS 查詢結(jié)束到 TCP 連接建立;
fmt.Println("TLSHandshake:", ti.TLSHandshake) // TLS 握手耗時;
fmt.Println("ServerTime:", ti.ServerTime) // 服務(wù)器處理耗時,計算從連接建立到客戶端收到第一個字節(jié)的時間間隔;
fmt.Println("ResponseTime:", ti.ResponseTime) // 響應(yīng)耗時,從接收到第一個響應(yīng)字節(jié),到接收到完整響應(yīng)之間的時間間隔;
fmt.Println("TotalTime:", ti.TotalTime) // 整個流程的耗時;
fmt.Println("IsConnReused:", ti.IsConnReused) // TCP 連接是否復(fù)用了;
fmt.Println("IsConnWasIdle:", ti.IsConnWasIdle) // 連接是否是從空閑的連接池獲取的;
fmt.Println("ConnIdleTime:", ti.ConnIdleTime) // 連接空閑時間;
fmt.Println("RequestAttempt:", ti.RequestAttempt) // 請求執(zhí)行流程中的請求次數(shù),包括重試次數(shù);
fmt.Println("RemoteAddr:", ti.RemoteAddr.String()) // 遠(yuǎn)程的服務(wù)地址,IP:PORT格式。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
本文名稱:go網(wǎng)絡(luò)請求包resty-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://aaarwkj.com/article4/gdhie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、網(wǎng)頁設(shè)計公司、品牌網(wǎng)站設(shè)計、電子商務(wù)、自適應(yīng)網(wǎng)站、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容