resty是 Go 語言的一個(gè) HTTP client 庫。resty功能十分強(qiáng)大,特性豐富,并提供了簡(jiǎn)單易用的 API。
詳情請(qǐng)到 官方文檔地址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)用一個(gè)resty.New() 創(chuàng)建一個(gè)client對(duì)象(客戶端)
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")
請(qǐng)求方法
Get調(diào)用client對(duì)象的R() 方法創(chuàng)建一個(gè)請(qǐng)求對(duì)象;
// 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請(qǐng)求攜帶請(qǐng)求體參數(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").
// 請(qǐng)求體
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ā)送請(qǐng)求到收到響應(yīng)的時(shí)間;
fmt.Println("Received At:", resp.ReceivedAt()) // 接收到響應(yīng)的時(shí)刻;
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("")
}
一般請(qǐng)求下,resty會(huì)根據(jù)響應(yīng)中的Content-Type來推斷數(shù)據(jù)格式。但是有時(shí)候響應(yīng)中無Content-Type首部或與內(nèi)容格式不一致,
我們可以通過調(diào)用請(qǐng)求對(duì)象的 ForceContentType()強(qiáng)制
讓resty按照特定的格式
來 解析響應(yīng):
client.R().
SetResult(tom).
ForceContentType("application/json").
Get("")
請(qǐng)求頭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()
// 如果該目錄 不存在 則會(huì) 自動(dòng)創(chuàng)建
client.SetOutDirectory("/home/hero")
// 使用相對(duì)路徑, 相對(duì)SetOutDirectory 設(shè)置的路徑
client.R().
SetOutput("static/aaa.png").
Get("")
// 也可以使用絕對(duì)路徑
client.R().
SetOutput("/home/hero/static/aaa.png").
Get("")
高級(jí)應(yīng)用
中間件Resty 提供了和Gin類似的中間件特性。 OnBeforeRequest 和 OnAfterResponse 回調(diào)方法,可以在請(qǐng)求之前和響應(yīng)之后加入自定義邏輯。參數(shù)包含了 resty.Client 和當(dāng)前請(qǐng)求的 resty.Request 對(duì)象。成功時(shí)返回 nil ,失敗時(shí)返回 error 對(duì)象。
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
})
請(qǐng)求重試由于網(wǎng)絡(luò)抖動(dòng)
帶來的接口穩(wěn)定性的問題 Resty 提供了重試功能來解決。SetRetryCount
設(shè)置重試次數(shù),SetRetryWaitTime
和SetRetryMaxWaitTime
設(shè)置等待時(shí)間。SetRetryAfter
是一個(gè)重試后的回調(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 方法為請(qǐng)求添加代理,還可以調(diào)用 RemoveProxy 移除代理。
client := resty.New()
client.SetProxy("http://proxyserver:1234")
client.RemoveProxy()
debug模式Go1.7 引入了HTTP trace,可以在HTTP客戶端請(qǐng)求過程中收集一些更細(xì)粒度的信息,httptrace包提供了HTTP trace的支持,收集的信息可用于調(diào)試延遲問題,服務(wù)監(jiān)控,編寫自適應(yīng)系統(tǒng)等。httptrace包提供了許多鉤子,在HTTP往返期間收集各種事件的信息,包括連接的創(chuàng)建、復(fù)用、DNS解析查詢、寫入請(qǐng)求和讀取響應(yīng)。
resty提供的一個(gè)輔助功能:trace, 就是基于 httptrace包。我們?cè)谡?qǐng)求對(duì)象上調(diào)用EnableTrace
()方法啟用 trace。啟用 trace 可以記錄請(qǐng)求的每一步的耗時(shí)和其他信息。
resp, err :=client.R().EnableTrace().Get("https://baidu.com")
ti := resp.Request.TraceInfo()
fmt.Println("DNSLookup:", ti.DNSLookup) // DNS 查詢時(shí)間,如果提供的是一個(gè)域名而非 IP,就需要向 DNS 系統(tǒng)查詢對(duì)應(yīng) IP 才能進(jìn)行后續(xù)操作;
fmt.Println("ConnTime:", ti.ConnTime) // 獲取一個(gè)連接的耗時(shí),可能從連接池獲取,也可能新建;
fmt.Println("TCPConnTime:", ti.TCPConnTime) // TCP 連接耗時(shí),從 DNS 查詢結(jié)束到 TCP 連接建立;
fmt.Println("TLSHandshake:", ti.TLSHandshake) // TLS 握手耗時(shí);
fmt.Println("ServerTime:", ti.ServerTime) // 服務(wù)器處理耗時(shí),計(jì)算從連接建立到客戶端收到第一個(gè)字節(jié)的時(shí)間間隔;
fmt.Println("ResponseTime:", ti.ResponseTime) // 響應(yīng)耗時(shí),從接收到第一個(gè)響應(yīng)字節(jié),到接收到完整響應(yīng)之間的時(shí)間間隔;
fmt.Println("TotalTime:", ti.TotalTime) // 整個(gè)流程的耗時(shí);
fmt.Println("IsConnReused:", ti.IsConnReused) // TCP 連接是否復(fù)用了;
fmt.Println("IsConnWasIdle:", ti.IsConnWasIdle) // 連接是否是從空閑的連接池獲取的;
fmt.Println("ConnIdleTime:", ti.ConnIdleTime) // 連接空閑時(shí)間;
fmt.Println("RequestAttempt:", ti.RequestAttempt) // 請(qǐng)求執(zhí)行流程中的請(qǐng)求次數(shù),包括重試次數(shù);
fmt.Println("RemoteAddr:", ti.RemoteAddr.String()) // 遠(yuǎn)程的服務(wù)地址,IP:PORT格式。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
本文名稱:go網(wǎng)絡(luò)請(qǐng)求包resty-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://www.rwnh.cn/article4/gdhie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、網(wǎng)頁設(shè)計(jì)公司、品牌網(wǎng)站設(shè)計(jì)、電子商務(wù)、自適應(yīng)網(wǎng)站、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容