内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

go網(wǎng)絡(luò)請(qǐng)求包resty-創(chuàng)新互聯(lián)

簡(jiǎn)介

resty是 Go 語言的一個(gè) HTTP client 庫。resty功能十分強(qiáng)大,特性豐富,并提供了簡(jiǎn)單易用的 API。
詳情請(qǐng)到 官方文檔地址https://github.com/go-resty/resty

成都創(chuàng)新互聯(lián)公司成立10多年來,這條路我們正越走越好,積累了技術(shù)與客戶資源,形成了良好的口碑。為客戶提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)、空間域名、網(wǎng)絡(luò)營(yíng)銷、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。網(wǎng)站是否美觀、功能強(qiáng)大、用戶體驗(yàn)好、性價(jià)比高、打開快等等,這些對(duì)于網(wǎng)站建設(shè)都非常重要,成都創(chuàng)新互聯(lián)公司通過對(duì)建站技術(shù)性的掌握、對(duì)創(chuàng)意設(shè)計(jì)的研究為客戶提供一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。
  • 安裝
// 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ì)象(客戶端)

  • 開啟 debug 模式
    每次請(qǐng)求可以 查看 請(qǐng)求報(bào)文 和 響應(yīng)報(bào)文 的詳細(xì)信息。
client := resty.New()

// Enable debug mode
client.SetDebug(true)
  • 禁用 https 證書檢查
client.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true })
  • 請(qǐng)求超時(shí)設(shè)置
client.SetTimeout(1 * time.Minute)
  • URL公共部分抽離
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ì)象;

  • Query
// Create a Resty Client
client := resty.New()

resp, err := client.R().
      SetQueryParams(map[string]string{  "age": "13",
          "name": "tom",
      }).Get("/search_result")
  • Params
client.R().
  SetPathParams(map[string]string{"age": "12",
    "name": "tom",
  }).
  Get("/users/{age}/{name}")
  • 請(qǐng)求體
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
  • json
// 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"}).
  • form-data
resp, err := client.R().
	SetFormData(map[string]string{"access_token": "BC594900-518B-4F7E-AC75-BD37F019E08F",
	}).
	Post("")
  • x-www-form-urlencoded
Put
// 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("")
Delete
resp, err := client.R().
      Delete("")
響應(yīng)體
  • 響應(yīng)數(shù)據(jù)
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)
  }
  • 自動(dòng) Unmarshal
    返回結(jié)構(gòu)化的數(shù)據(jù),如 JSON/XML 格式等。resty可以自動(dòng)將響應(yīng)數(shù)據(jù) Unmarshal 到對(duì)應(yīng)的結(jié)構(gòu)體對(duì)象中。
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)求頭
  • 設(shè)置一般首部
client.R().
	SetHeader("Content-Type", "application/json").
	SetHeader("aaa", "bbb").
  	Get("")


client.SetHeaders(map[string]string{"Content-Type": "application/json",
        "aaa": "bbb",
      })
  • Content-Length首部,resty自動(dòng)計(jì)算
client.R().
  SetBody(User{Name:"dj"}).
  SetContentLength(true).
  Get("")
上下文件 上傳文件
  • 通過 io.Reader
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ù),SetRetryWaitTimeSetRetryMaxWaitTime設(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)

網(wǎng)站托管運(yùn)營(yíng)
揭阳市| 宁国市| 博罗县| 黄平县| 新丰县| 张家界市| 福州市| 通辽市| 白城市| 商河县| 梅州市| 桐庐县| 谷城县| 明水县| 南汇区| 巴塘县| 安阳市| 东乡县| 山阴县| 新晃| 象山县| 格尔木市| 盖州市| 龙泉市| 大新县| 颍上县| 苍山县| 城固县| 武平县| 上林县| 厦门市| 昌宁县| 防城港市| 平谷区| 靖西县| 三门峡市| 思茅市| 东安县| 江津市| 焦作市| 威信县|