成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Golang的一個簡單實(shí)用的http客戶端庫httpc-創(chuàng)新互聯(lián)

httpc簡介

httpc這是一個發(fā)起http請求的客戶端庫。
它具有的特色包括:簡單易用、易于擴(kuò)展、支持鏈?zhǔn)秸{(diào)用、支持多種格式的處理等。
特別適合用來調(diào)用restfull風(fēng)格的接口。

站在用戶的角度思考問題,與客戶深入溝通,找到雙河網(wǎng)站設(shè)計與雙河網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請域名、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋雙河地區(qū)。

項(xiàng)目地址

https://github.com/recallsong/httpc

下載

go get github.com/recallsong/httpc

Api文檔

查看 在線Api文檔

我們也可以利用godoc工具在本地查看api文檔:

godoc -http=:9090

在瀏覽器中查看地址:

http://localhost:9090/pkg/github.com/recallsong/httpc

快速入門

最簡單的使用方式

var resp string
// GET http://localhost/hello?name=RecallSong
err := httpc.New("http://localhost").Path("hello").Query("name", "RecallSong").Get(&resp)
if err != nil {
    fmt.Println(resp) // 以字符串方式獲取響應(yīng)的數(shù)據(jù)
} else {
    fmt.Println(err)
}

設(shè)置請求頭和Cookie等

var resp string
err := httpc.New("http://localhost").Path("/hello").Query("param", "value").
    Header("MyHeader", "HeaderValue").
    AddCookie(&http.Cookie{Name: "cookieName", Value: "cookieValue"}).
    Body("body data").Post(&resp)
if err != nil {
    fmt.Println(resp) // 以字符串方式獲取響應(yīng)的數(shù)據(jù)
} else {
    fmt.Println(err)
}

發(fā)送和接收json格式的數(shù)據(jù)

使用map傳遞數(shù)據(jù)

body := map[string]interface{}{
    "name": "RecallSong",
    "age":  18,
}
var resp map[string]interface{}
// 根據(jù)請求的Content-Type自動對數(shù)據(jù)進(jìn)行轉(zhuǎn)換
err := httpc.New("http://localhost").Path("json").
    ContentType(httpc.TypeApplicationJson).
    Body(body). // body轉(zhuǎn)變?yōu)?{"name":"RecallSong","age":18}
    Post(&resp) // 根據(jù)響應(yīng)中的Content-Type,將返回的數(shù)據(jù)解析到resp中
fmt.Println(err, resp)

// 如果請求或響應(yīng)沒有指定Content-Type,或是不正確,也可以強(qiáng)制指定轉(zhuǎn)換格式類型
err = httpc.New("http://localhost").Path("json").
    Body(body, httpc.TypeApplicationJson). // body轉(zhuǎn)變?yōu)?{"name":"RecallSong","age":18}
    Post(&resp, httpc.TypeApplicationJson) // 將返回的數(shù)據(jù)按json格式解析到map中
fmt.Println(err, resp)

使用struct傳遞數(shù)據(jù)

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}
body := Person{Name: "RecallSong", Age: 18}
var resp Person
err := httpc.New("http://localhost").Path("json").
    Body(body, httpc.TypeApplicationJson).
    Post(&resp, httpc.TypeApplicationJson)
fmt.Println(err, resp)

發(fā)送和接收xml格式的數(shù)據(jù)

type Person struct {
    Name string `xml:"name"`
    Age  int    `xml:"age"`
}
body := Person{Name: "RecallSong", Age: 18}
var resp Person
err := httpc.New("http://localhost").Path("xml").
    Body(body, httpc.TypeApplicationXml). // 數(shù)據(jù)轉(zhuǎn)變?yōu)閤ml格式
    Post(&resp, httpc.TypeApplicationXml)
fmt.Println(err, resp)

發(fā)送表單參數(shù)

使用結(jié)構(gòu)體發(fā)送

sbody := struct {
    Name string `form:"name"`
    Age  int    `form:"age"`
}{
    Name: "RecallSong",
    Age:  18,
}
var resp string
err := httpc.New("http://localhost").Path("echo").
    Body(sbody, httpc.TypeApplicationForm). // 將結(jié)構(gòu)體轉(zhuǎn)變?yōu)閒orm格式的數(shù)據(jù)體
    Post(&resp)
fmt.Println(err, resp)

使用map發(fā)送

mbody := map[string]interface{}{
    "name": "RecallSong",
    "age":  19,
}
var resp string
err := httpc.New("http://localhost").Path("echo").
    Body(mbody, httpc.TypeApplicationForm). // 將map變?yōu)閒orm格式的數(shù)據(jù)體
    Post(&resp)
fmt.Println(err, resp)

使用url.Values發(fā)送

ubody := url.Values{}
ubody.Set("name", "RecallSong")
ubody.Set("age", "20")
var resp string
err := httpc.New("http://localhost").Path("echo").
    Body(ubody). // 將url.Values類型轉(zhuǎn)變form格式的數(shù)據(jù)體
    Post(&resp)
fmt.Println(err, resp)

自動編碼url路徑參數(shù)

var resp string
// 可以自動編碼url路徑參數(shù)
err := httpc.New("http://localhost").EscapedPath("recall/Song").EscapedPath(18).Get(&resp)
// 請求地址為 http://localhost/recall%2FSong/18
fmt.Println(err, resp)

上傳文件

方式1

file, err := os.Open("doc.go")
if err != nil {
  fmt.Println(err)
  return
}
defer file.Close()
body := map[string]interface{}{
    "file":  file,
    "name":  "RecallSong",
    "age":   18,
    "file2": httpc.FilePath("doc.go:hello.go"), //上傳doc.go文件,參數(shù)名為file2,文件名為hello.go
}
var resp string
err = httpc.New("http://localhost").Path("echo").
    Body(body, httpc.TypeMultipartFormData).Post(&resp)
fmt.Println(err)

方式2

file, err := os.Open("doc.go")
if err != nil {
    fmt.Println(err)
    return
}
defer file.Close()
body := struct {
    Name    string         `form:"name"`
    Address []string       `form:"address"`
    Age     int            `form:"age"`
    File    *os.File       `form:"file" file:"hello.go"`
    File2   httpc.FilePath `form:"file2"`
}{
    Name:    "RecallSong",
    Address: []string{"HangZhou", "WenZhou"},
    Age:     18,
    File:    file,
    File2:   httpc.FilePath("doc.go:hello2.go"), //上傳doc.go文件,參數(shù)名為file2,文件名為hello2.go
}
var resp string
err = httpc.New("http://localhost").Path("echo").
    Body(body, httpc.TypeMultipartFormData).Post(&resp)
fmt.Println(err)

接收響應(yīng)數(shù)據(jù)

// 前面的例子我們知道了可以接收json和xml格式的數(shù)據(jù),也可以接收數(shù)據(jù)到一個string變量中
// 除此之外,我們還可以有一下幾種方式接收數(shù)據(jù)

// []byte 方式接收
var bytesResp []byte
err := httpc.New("http://localhost").Path("hello").Get(&bytesResp)
fmt.Println(err, bytesResp)

// *http.Response 方式接收
var resp *http.Response
err := httpc.New("http://localhost").Path("hello").Get(&resp)
if err != nil {
  fmt.Println(err)
} else {
  // 注意這種方式要關(guān)閉Body
  defer resp.Body.Close()
  body, err := ioutil.ReadAll(resp.Body)
  fmt.Println(err, string(body))
}

下載文件

方式1

// 默認(rèn)方式保存文件
err := httpc.New("http://localhost").Path("echo").Body("content").Post(httpc.FilePath("download1.txt"))
fmt.Println(err)

方式2

err := httpc.New("http://localhost").Path("echo").Body("content").Post(&httpc.SaveInfo{
    Path:     "download2.txt",
    Override: true,
    Mode:     0777})
fmt.Println(err)

指定成功的http狀態(tài)碼

// 如果返回的狀態(tài)碼與指定的狀態(tài)碼不匹配,則返回一個error
err := httpc.New("http://localhost").Path("not_exist").
    SuccessStatus(200).Get(nil)
fmt.Println(err)
// Output:
// error http status 404 , expect 200

請求上下文

// 請求上下文中包含了每次請求的設(shè)置、連接設(shè)置等,所有請求應(yīng)該盡量共享Context
// 我們可以設(shè)置回調(diào)通知的函數(shù)
ctx := httpc.NewContext().
AddCbBeforeSend(func(client *httpc.HttpC, args ...interface{}) error {
    fmt.Println("before request")
    return nil
}).
AddCbAfterSend(func(client *httpc.HttpC, args ...interface{}) error {
    fmt.Println("after response")
    return nil
}).
AddCbOnError(func(client *httpc.HttpC, args ...interface{}) error {
    fmt.Println("on error")
    return nil
}).
SetConnectReadTimeout(30*time.Second, 30*time.Second)
var resp string
err := httpc.New("http://localhost").Path("hello").SetContext(ctx).Get(&resp)
fmt.Println(err, resp)

// 庫默認(rèn)生成了一個上下文實(shí)例 httpc.DefaultContext,它并沒有加鎖保護(hù),所以盡量在所有請求前設(shè)置好它
// 改變httpc.DefaultContext會影響所有未調(diào)用過SetContext的請求
httpc.DefaultContext.SetConnectReadTimeout(30*time.Second, 30*time.Second)
err = httpc.New("http://localhost").Path("hello").Get(&resp)
fmt.Println(err, resp)

超時設(shè)置

err := httpc.New("http://localhost").Path("timeout").
SetContext(httpc.NewContext().SetConnectReadTimeout(time.Second, time.Second)).
  Get(nil)
fmt.Println(err)

請求重試

err := httpc.New("http://not_exist/").Path("not_exist").
    SetContext(httpc.NewContext().AddCbOnRetring(func(c *httpc.HttpC, args ...interface{}) error {
        fmt.Printf("retring %v, next interval %v\n", args[0], args[1])
        return nil
    }).SetRetryConfig(3, time.Second, 2)). // 重試3次,重試時間間隔依次為:2s, 4s, 8s
    Get(nil)
fmt.Println(err)

// Output:
// retring 1, next interval 2s
// retring 2, next interval 4s
// retring 3, next interval 8s
// Get http://not_exist/not_exist: dial tcp: lookup not_exist: no such host

自定義請求或響應(yīng)處理器

// httpc庫已經(jīng)注冊了一些通用的請求和響應(yīng)處理器,但我們也可以額外添加處理器
ctx := httpc.NewContext()
ctx.BodyReaders = httpc.NewBodyReaders()
ctx.BodyReaders.RespBodyTypeReaders[reflect.TypeOf((*int)(nil))] = func(resp *http.Response, reader io.ReadCloser, typ reflect.Type, out interface{}) error {
    output := out.(*int)
    *output = resp.StatusCode
    return nil
}
// 返回響應(yīng)狀態(tài)碼
var status int
err := httpc.New("http://localhost").Path("hello").
    SetContext(ctx).
    Get(&status)
fmt.Println(err, status)
// Output:
// <nil> 200

其他特性

請參考Api文檔或源碼

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。

網(wǎng)頁名稱:Golang的一個簡單實(shí)用的http客戶端庫httpc-創(chuàng)新互聯(lián)
分享路徑:http://jinyejixie.com/article8/ghsop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、網(wǎng)站導(dǎo)航微信小程序、企業(yè)建站、標(biāo)簽優(yōu)化網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
黎川县| 枞阳县| 东莞市| 罗定市| 洪泽县| 鞍山市| 牡丹江市| 灵山县| 绵阳市| 长宁县| 定西市| 宝兴县| 汉寿县| 厦门市| 长兴县| 高雄市| 湘潭市| 满洲里市| 宜兰县| 湖口县| 丰原市| 沭阳县| 晋宁县| 南开区| 贵溪市| 兴宁市| 伽师县| 运城市| 蕲春县| 南雄市| 邻水| 贵定县| 永清县| 柳河县| 建德市| 北安市| 安福县| 宜昌市| 泰和县| 黔东| 房产|