欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Go語(yǔ)言如何進(jìn)行Http調(diào)用

 更新時(shí)間:2022年12月15日 09:12:19   作者:陳明勇  
無(wú)論是微服務(wù)還是單體架構(gòu)等,服務(wù)間都有相互通信的時(shí)候,而最直接的通信方法就是 HTTP 調(diào)用,本文將會(huì)介紹在 Go 語(yǔ)言里,如何進(jìn)行 HTTP 調(diào)用,需要的可以參考一下

前言

無(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ò) NewRequestWithContextNewRequest 函數(shù)獲取一個(gè)基礎(chǔ)的 Request 結(jié)構(gòu)體指針變量。

NewRequestWithContext(ctx context.Context, method, url string, body io.Reader) (*Request, error)

  • 參數(shù) ctxContext 的接口類(lèi)型,任意實(shí)現(xiàn) Context 接口的自定義類(lèi)型都可以作為此參數(shù)傳遞。
  • 參數(shù) methodHTTP 方法參數(shù),可選值有 GETPOST、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ò)讀取 Responsebody 的值,可以獲取接口的響應(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ò) ResponseStatusCode 字段進(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 類(lèi)型。

小結(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)體的獲取方法。

到此這篇關(guān)于詳解Go語(yǔ)言如何進(jìn)行Http調(diào)用的文章就介紹到這了,更多相關(guān)Go語(yǔ)言Http調(diào)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go?不支持?[]T轉(zhuǎn)換為[]interface類(lèi)型詳解

    Go?不支持?[]T轉(zhuǎn)換為[]interface類(lèi)型詳解

    這篇文章主要為大家介紹了Go不支持[]T轉(zhuǎn)換為[]interface類(lèi)型詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 一文詳解Golang中的切片數(shù)據(jù)類(lèi)型

    一文詳解Golang中的切片數(shù)據(jù)類(lèi)型

    這篇文章主要介紹了一文詳解Golang中的切片數(shù)據(jù)類(lèi)型,切片是一個(gè)種特殊的數(shù)組。是對(duì)數(shù)組的一個(gè)連續(xù)片段的引用,所以切片是一個(gè)引用類(lèi)型
    2022-09-09
  • golang開(kāi)發(fā)及數(shù)字證書(shū)研究分享

    golang開(kāi)發(fā)及數(shù)字證書(shū)研究分享

    這篇文章主要為大家介紹了golang開(kāi)發(fā)以及數(shù)字證書(shū)的研究示例分享,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • go如何優(yōu)雅關(guān)閉Graceful?Shutdown服務(wù)

    go如何優(yōu)雅關(guān)閉Graceful?Shutdown服務(wù)

    這篇文章主要為大家介紹了go優(yōu)雅關(guān)閉Graceful?Shutdown服務(wù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Go語(yǔ)言學(xué)習(xí)教程之goroutine和通道的示例詳解

    Go語(yǔ)言學(xué)習(xí)教程之goroutine和通道的示例詳解

    這篇文章主要通過(guò)A?Tour?of?Go中的例子進(jìn)行學(xué)習(xí),以此了解Go語(yǔ)言中的goroutine和通道,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-09-09
  • golang使用jaeger進(jìn)行鏈路追蹤

    golang使用jaeger進(jìn)行鏈路追蹤

    鏈路追蹤是指在分布式系統(tǒng)中,將一次請(qǐng)求的處理過(guò)程進(jìn)行記錄并聚合展示的一種方法,目的是將一次分布式請(qǐng)求的調(diào)用情況集中在一處展示,本文將介紹golang如何使用jaeger進(jìn)行鏈路追蹤,需要的朋友可以參考下
    2024-06-06
  • golang如何用type-switch判斷interface變量的實(shí)際存儲(chǔ)類(lèi)型

    golang如何用type-switch判斷interface變量的實(shí)際存儲(chǔ)類(lèi)型

    這篇文章主要介紹了golang如何用type-switch判斷interface變量的實(shí)際存儲(chǔ)類(lèi)型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • golang獲取客戶端ip的實(shí)現(xiàn)

    golang獲取客戶端ip的實(shí)現(xiàn)

    本文主要介紹了golang獲取客戶端ip的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • go?語(yǔ)言爬蟲(chóng)庫(kù)goquery的具體使用

    go?語(yǔ)言爬蟲(chóng)庫(kù)goquery的具體使用

    GoQuery是專為Go語(yǔ)言設(shè)計(jì)的一個(gè)強(qiáng)大的HTML解析和查詢庫(kù),本文主要介紹了go語(yǔ)言爬蟲(chóng)庫(kù)goquery的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Go-Web框架中AOP方案的實(shí)現(xiàn)方式

    Go-Web框架中AOP方案的實(shí)現(xiàn)方式

    本文主要介紹了Go-Web框架中AOP方案的實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評(píng)論