最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go類型安全的HTTP請(qǐng)求示例詳解

 更新時(shí)間:2022年06月21日 10:22:21   作者:萬俊峰Kevin  
這篇文章主要為大家介紹了Go類型安全的HTTP請(qǐng)求示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

對(duì) Gopher 來說,雖然我們基本都是在寫代碼讓別人來請(qǐng)求,但是有時(shí)候,我們也需要去請(qǐng)求第三方提供的 RESTful 接口,這個(gè)時(shí)候,我們才能感受到前端同學(xué)拼接 HTTP 請(qǐng)求參數(shù)的痛苦。

比如,我們要發(fā)起類似這樣一個(gè)請(qǐng)求,看起來很簡(jiǎn)單,實(shí)際寫起來還是比較繁瑣的。

POST /articles/5/update?device=ios HTTP/1.1
Host: go-zero.dev
Authorization: Bearer <jwt-token>
{"author":"kevin","body":"this is not important!","title":"my title","type":6}

Go 原生寫法

這個(gè) API 其實(shí)是蠻簡(jiǎn)單的,我們直接上手就可以寫出來。

func main() {
    var buf bytes.Buffer
    encoder := json.NewEncoder(&buf)
    params := map[string]interface{}{
        "title":  "my title",
        "body":   "this is not important!",
        "author": "kevin",
        "type":   6,
    }
    if err := encoder.Encode(params); err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    url := fmt.Sprintf("http://localhost:3333/articles/%d/update?device=%s", 5, "ios")
    req, err := http.NewRequest(http.MethodPost, url, &buf)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    req.Header.Add("Authorization", "Bearer <jwt-token>")
    cli := http.Client{}
    resp, err := cli.Do(req)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    io.Copy(os.Stdout, resp.Body)
}

我們跑了測(cè)試一下,發(fā)現(xiàn)沒有得到 200 OK,抓包看一下,請(qǐng)求如下。各位不要往下看,你能想到失敗的原因嗎?

POST /articles/5/update?device=ios HTTP/1.1
Host: go-zero.dev
User-Agent: Go-http-client/1.1
Content-Length: 79
Authorization: Bearer <jwt-token>
Accept-Encoding: gzip
{"author":"kevin","body":"this is not important!","title":"my title","type":6}

具體失敗原因這里就不細(xì)講了,我們先來分析這段代碼??梢钥吹狡渲袨榱似唇訁?shù)使用了 map[string]interface{},對(duì)于其中每個(gè)字段我們是不能校驗(yàn)類型是否匹配的,只有發(fā)送出去了,收到了服務(wù)端的 200 OK,我們才能確認(rèn)傳對(duì)了。比如其中的 type 參數(shù),這里是使用了 int 類型,我們可能順手寫成 string 類型,但是不請(qǐng)求我們還是很難發(fā)現(xiàn)這個(gè)參數(shù)寫錯(cuò)了的。

那么讓我們看看 go-zero 里 httpc 包是怎么使用并保證類型安全的。

httpc 實(shí)現(xiàn)

我們看看用 httpc 包來請(qǐng)求的代碼怎么寫。

const url = "http://go-zero.dev/articles/:id/update"
type UpdateArticle struct {
    ID            int    `path:"id"`
    Device        string `form:"device,options=ios,android,web,desktop"`
    Authorization string `header:"Authorization"`
    Title         string `json:"title"`
    Body          string `json:"body"`
    Author        string `json:"author"`
    Type          int    `json:"type"`
}
func main() {
    data := &UpdateArticle{
        ID:            5,
        Device:        "ios",
        Authorization: "Bearer <jwt-token>",
        Title:         "my title",
        Body:          "this is not important!",
        Author:        "kevin",
        Type:          6,
    }
    resp, err := httpc.Do(context.Background(), http.MethodPost, url, data)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    io.Copy(os.Stdout, resp.Body)
}

寫完測(cè)試一下,結(jié)果正如預(yù)期:

POST /articles/5/update?device=ios HTTP/1.1
Host: go-zero.dev
User-Agent: Go-http-client/1.1
Content-Length: 79
Content-Type: application/json; charset=utf-8
Authorization: Bearer <jwt-token>
Accept-Encoding: gzip
{"author":"kevin","body":"this is not important!","title":"my title","type":6}

你發(fā)現(xiàn)了沒有,跟前面的對(duì)比,其中多了 Content-Type: application/json; charset=utf-8,而我們之前寫法里忘記設(shè)置 Content-Type 了。

而 httpc 的寫法只要定義好請(qǐng)求的類型,然后通過 httpc.Do 就可以做到類型安全,并且代碼非常精簡(jiǎn)。支持了如我們代碼所示的 path、form、header 和 json,可以非常方便且類型安全的發(fā)送 HTTP 請(qǐng)求。

更多能力

除了上面展示的簡(jiǎn)單易用和類型安全以外,httpc 包還有以下特點(diǎn):

  • context 的超時(shí)控制
  • OpenTelemetry 自動(dòng)集成,服務(wù)端返回的 trace-id, span-id 都會(huì)自動(dòng)被記錄到日志里,便于后續(xù)客戶端、服務(wù)端協(xié)同查問題
  • 可以通過 httpc.Service 來獲得熔斷能力,當(dāng)服務(wù)端有問題,會(huì)自動(dòng)熔斷隔離請(qǐng)求,避免浪費(fèi)時(shí)間等待和加劇服務(wù)端壓力

項(xiàng)目地址 github.com/zeromicro/g…

以上就是Go類型安全的HTTP請(qǐng)求示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go類型安全HTTP請(qǐng)求的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言防范SQL注入CSRF及XSS攻擊實(shí)例探究

    Go語言防范SQL注入CSRF及XSS攻擊實(shí)例探究

    在本文中,我們將會(huì)介紹幾種最常見的攻擊類型,并且介紹如何使用Golang來防范這些攻擊,本文會(huì)涉及XSS攻擊、CSRF攻擊、SQL注入等,如果你想學(xué)習(xí)Golang和網(wǎng)絡(luò)安全的相關(guān)知識(shí),那么這篇文章會(huì)是一個(gè)很好的開始
    2024-01-01
  • golang組件swagger生成接口文檔實(shí)踐示例

    golang組件swagger生成接口文檔實(shí)踐示例

    這篇文章主要為大家介紹了golang組件swagger生成接口文檔實(shí)踐示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • 詳解Go開發(fā)Struct轉(zhuǎn)換成map兩種方式比較

    詳解Go開發(fā)Struct轉(zhuǎn)換成map兩種方式比較

    本篇文章主要介紹了詳解Go開發(fā)Struct轉(zhuǎn)換成map兩種方式比較,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • go語言實(shí)戰(zhàn)之實(shí)現(xiàn)比特幣地址校驗(yàn)步驟

    go語言實(shí)戰(zhàn)之實(shí)現(xiàn)比特幣地址校驗(yàn)步驟

    這篇文章主要介紹了go語言實(shí)戰(zhàn)之實(shí)現(xiàn)比特幣地址校驗(yàn)步驟,利用生產(chǎn)的隨機(jī)數(shù)采用橢圓加密算法生成公鑰,具體步驟實(shí)例代碼請(qǐng)參考下本文
    2021-05-05
  • go語言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析

    go語言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析

    這篇文章主要為大家介紹了go語言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • 使用golang獲取linux上文件的訪問/創(chuàng)建/修改時(shí)間

    使用golang獲取linux上文件的訪問/創(chuàng)建/修改時(shí)間

    這篇文章主要介紹了使用golang獲取linux上文件的訪問/創(chuàng)建/修改時(shí)間,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • Go語言中for和range的性能比較

    Go語言中for和range的性能比較

    這篇文章主要為大家詳細(xì)介紹了Go語言中for和range語句的使用以及性能比較,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-07-07
  • 一文帶你了解Golang中的緩沖區(qū)Buffer

    一文帶你了解Golang中的緩沖區(qū)Buffer

    作為一種常見的數(shù)據(jù)結(jié)構(gòu),緩沖區(qū)(Buffer)在計(jì)算機(jī)科學(xué)中有著廣泛的應(yīng)用。這篇文章將詳細(xì)介紹?Go?中?Buffer?的用法,從多個(gè)方面介紹其特性和應(yīng)用場(chǎng)景,需要的可以參考一下
    2023-05-05
  • Go?interface{}?轉(zhuǎn)切片類型的實(shí)現(xiàn)方法

    Go?interface{}?轉(zhuǎn)切片類型的實(shí)現(xiàn)方法

    本文主要介紹了Go?interface{}?轉(zhuǎn)切片類型的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 如何使用golang實(shí)現(xiàn)traceroute

    如何使用golang實(shí)現(xiàn)traceroute

    這篇文章主要介紹了如何使用golang實(shí)現(xiàn)traceroute,該工具在linux環(huán)境下的命令是traceroute或者tracepath,在windows下命令是tracert,本文給大家詳細(xì)講解需要的朋友可以參考下
    2023-04-04

最新評(píng)論

龙岩市| 庆城县| 越西县| 大同市| 开化县| 资源县| 肇东市| 都江堰市| 博野县| 灵宝市| 即墨市| 措勤县| 永善县| 广平县| 浙江省| 那曲县| 米泉市| 六安市| 翁牛特旗| 上杭县| 格尔木市| 正宁县| 固安县| 毕节市| 垫江县| 开封县| 平南县| 泾阳县| 兴城市| 山丹县| 沂南县| 岗巴县| 金溪县| 威海市| 家居| 兴化市| 南木林县| 嘉义县| 抚州市| 渭源县| 雷波县|