欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

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

簡介

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

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

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

// Enable debug mode
client.SetDebug(true)
  • 禁用 https 證書檢查
client.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true })
  • 請求超時設(shè)置
client.SetTimeout(1 * time.Minute)
  • URL公共部分抽離
client := resty.New()
client.SetBaseURL("https://whero.com")
resp, err := client.R().Get("/s/user")
請求方法 Get

調(diào)用client對象的R() 方法創(chuàng)建一個請求對象;

  • 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}")
  • 請求體
client := resty.New()

// 讓get請求攜帶請求體參數(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").
      // 請求體   
      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ā)送請求到收到響應(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)
  }
  • 自動 Unmarshal
    返回結(jié)構(gòu)化的數(shù)據(jù),如 JSON/XML 格式等。resty可以自動將響應(yīng)數(shù)據(jù) Unmarshal 到對應(yīng)的結(jié)構(gòu)體對象中。
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("")
請求頭
  • 設(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自動計算
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()
// 如果該目錄 不存在 則會 自動創(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ù),SetRetryWaitTimeSetRetryMaxWaitTime設(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)

網(wǎng)站托管運營
国产情侣自拍在线观看| 亚洲国产精品视频自拍| 国产精品亚洲精品日韩在线| 亚洲一级特黄大片在线观看| 成人黄色av网站在线观看| 国产成人自拍激情视频| 国内精日韩欧中文的话| 欧美午夜一级特黄大片 | 白白日韩欧美在线视频| 成人激情视频在线观看| 综合久久—本道中文字幕| 99热久久精品免费精品| 最新亚洲av熟女播放| 亚洲最新一区二区在线观看| 国产日韩欧美在线精品| 97超频在线观看免费| 免费国产三级在线观看| 日韩精品在线观看一二三区| 免费搜索国产男女视频| 成人高清乱码一区二区三区| 欧美日韩黄色的三级视频| 日韩在线视频这里只有精品| 亚洲一区欧美二区日韩| 国产在线精品91系列| 日本久久高清免费观看| 激情小说婷婷亚洲综合| 深夜福利在线观看97| 亚洲av综合日韩精品久久| 成年爽片在线观看播放欧美| 九九热最新视频免费看| 亚洲国产欧美日韩激情在线| 先锋影音女同中文字幕 | 依依成人影院在线观看av| 后入动漫视频在线观看| 视频一区二区三区不卡| 欧美激情另类综合国内| 精品视频在线观看传媒| 一区二区尤物区亚洲国产精品区| 久久香蕉国产线看观看亚洲| 亚洲日本韩国视频久久精品| 高清欧美精品一区二区三区|