
【資料圖】
耐心和持久勝過(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ō)明。
?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)體。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?
? 類型。
本文介紹了在 ??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ù)