熱門(mén):Go HTTP 調(diào)用(上)

2022-12-14 11:22:55 來(lái)源:51CTO博客


【資料圖】

耐心和持久勝過(guò)激烈和狂熱。

哈嘍大家好,我是陳明勇,今天分享的內(nèi)容是 Go HTTP 調(diào)用。如果本文對(duì)你有幫助,不妨點(diǎn)個(gè)贊,如果你是 Go 語(yǔ)言初學(xué)者,不妨點(diǎn)個(gè)關(guān)注,一起成長(zhǎng)一起進(jìn)步,如果本文有錯(cuò)誤的地方,歡迎指出!

前言

無(wú)論是微服務(wù)還是單體架構(gòu)等,服務(wù)間都有相互通信的時(shí)候,而最直接的通信方法就是 ??HTTP??? 調(diào)用,本文將會(huì)介紹在 ??Go??? 語(yǔ)言里,如何進(jìn)行 ??HTTP?? 調(diào)用,并舉例說(shuō)明。

前置知識(shí)

??HTTP??? 調(diào)用需要通過(guò) ??http??? 包里的 ??Client??? 結(jié)構(gòu)體里的 ??Do??? 方法去實(shí)現(xiàn),因此需要先聲明一個(gè) ??Client?? 結(jié)構(gòu)體變量,該結(jié)構(gòu)體可以設(shè)置超時(shí)時(shí)間等配置。對(duì)于一個(gè)請(qǐng)求里的 ??URL???,查詢參數(shù),請(qǐng)求 ??method??? 等參數(shù),需要 ??http??? 包里的 ??Request??? 結(jié)構(gòu)體去封裝。我們可以通過(guò) ??NewRequestWithContext??? 或 ??NewRequest??? 函數(shù)獲取一個(gè)基礎(chǔ)的 ??Request?? 結(jié)構(gòu)體指針變量。??NewRequestWithContext(ctx context.Context, method, url string, body io.Reader) (*Request, error)??參數(shù) ??ctx??? 為 ??Context??? 的接口類型,任意實(shí)現(xiàn) ??Context?? 接口的自定義類型都可以作為此參數(shù)傳遞。參數(shù) ??method??? 為 ??HTTP??? 方法參數(shù),可選值有 ??GET???、??POST???、??DELETE???、??PUT??等。參數(shù) ??url?? 為接口的請(qǐng)求路徑。參數(shù) ??body??,為請(qǐng)求體參數(shù)。通過(guò) ??client.Do(req)??? 方法調(diào)用之后,返回值有 ??(*Response, error)???,第一個(gè)是響應(yīng)結(jié)構(gòu)體參數(shù),第二個(gè)是錯(cuò)誤參數(shù)。通過(guò)讀取 ??Response??? 的 ??body?? 的值,可以獲取接口的響應(yīng)體。

GET 請(qǐng)求

import (  "context"  "fmt"  "io"  "net/http")func main() {  client := http.Client{}  request, err := http.NewRequestWithContext(context.Background(), http.MethodGet, "http://localhost:8080/user?name=tom", nil)  if err != nil {    return  }  request.Header.Set("headerParam", "header")  resp, err := client.Do(request)  if err != nil {    fmt.Println(err)    return  }  bytes, err := io.ReadAll(resp.Body)  if err != nil {    return  }  defer resp.Body.Close()  fmt.Println(string(bytes)) // {"code":0,"data":{"list":[{"name":"小明","age":20},{"name":"小紅","age":18}]},"message":"success"}}
需要攜帶查詢參數(shù)時(shí),可以直接拼接在 ??url?? 字符串上面。??header??? 參數(shù)可以通過(guò) request 結(jié)構(gòu)體的 ??Header??? 字段的 ??set??? 方法或 ??add?? 方法進(jìn)行設(shè)置。HTTP 請(qǐng)求響應(yīng)碼可以通過(guò) ??Response??? 的 ??StatusCode?? 字段進(jìn)行查看。接口請(qǐng)求成功之后,通過(guò) ??io.ReadAll??? 方法,讀取 ??resp.Body?? 響應(yīng)體信息。除了直接在 ??url??? 上拼接 ??query??? 參數(shù)的方式,我們還可以通過(guò)以下方式進(jìn)行添加 ??query?? 參數(shù):
params := url.Values{}rawUrl, err := url.Parse("http://localhost:8080/user")if err != nil {  return}params.Set("name", "tom")rawUrl.RawQuery = params.Encode()u := rawUrl.String()

通過(guò) ??url.Values??? 結(jié)構(gòu)體的 ??set??? 方法設(shè)置 query參數(shù),??url??? 通過(guò) ??url.Parse??? 函數(shù)生成一個(gè) ??URL??? 結(jié)構(gòu)體指針變量,??rawUrl.RawQuery = params.Encode()??? 通過(guò)這行代碼將 ??query??? 參數(shù)和 ??url??? 進(jìn)行綁定,最后通過(guò) ??String()??? 方法將 ??url??? 轉(zhuǎn)換成 ??string?? 類型。

小結(jié)

本文介紹了在 ??Go??? 語(yǔ)言里如何進(jìn)行 ??HTTP??? 調(diào)用,需要通過(guò) ??http??? 包里的 ??Client??? 結(jié)構(gòu)體變量,調(diào)用其方法 ??Do??? 進(jìn)行 ??HTTP??? 調(diào)用,在 ??HTTP??? 調(diào)用前,需要通過(guò) ??http??? 包里的 ??Request??? 結(jié)構(gòu)體封裝請(qǐng)求路徑和請(qǐng)求參數(shù)。最后通過(guò) ??GET??? 請(qǐng)求案例講述了 ??query??? 參數(shù)和 ??header?? 參數(shù)如何設(shè)置,以及響應(yīng)體的獲取方法。

標(biāo)簽: 指針變量 函數(shù)生成 請(qǐng)求參數(shù)

上一篇:每日熱聞!C語(yǔ)言大一期末復(fù)習(xí)基礎(chǔ)知識(shí)點(diǎn)
下一篇:#yyds干貨盤(pán)點(diǎn)#聊聊vuex的Mutations和Actions