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

Go語(yǔ)言封裝HTTP請(qǐng)求的Curl工具包詳解

 更新時(shí)間:2025年03月11日 08:32:21   作者:熬了夜的程序員  
在 Go 語(yǔ)言開發(fā)中,與 HTTP 服務(wù)進(jìn)行交互是非常常見的需求,本文將分享一個(gè)用 Go 語(yǔ)言封裝的 Curl 工具包,它提供了簡(jiǎn)潔易用的接口來(lái)進(jìn)行 HTTP 請(qǐng)求,需要的可以了解下

在 Go 語(yǔ)言開發(fā)中,與 HTTP 服務(wù)進(jìn)行交互是非常常見的需求。本文將分享一個(gè)用 Go 語(yǔ)言封裝的 Curl 工具包,它提供了簡(jiǎn)潔易用的接口來(lái)進(jìn)行 HTTP 請(qǐng)求,包括 GET、POST、PUT 和 DELETE 等常見操作。通過(guò)這個(gè)工具包,可以輕松管理 HTTP 請(qǐng)求頭、查詢參數(shù)和請(qǐng)求體,并處理響應(yīng)。

工具包結(jié)構(gòu)簡(jiǎn)介

在這個(gè) curl 工具包中,主要定義了一個(gè) Curl 結(jié)構(gòu)體,封裝了 HTTP 客戶端的常見操作。

核心結(jié)構(gòu)體定義

type Curl struct {
    client  *http.Client      // http client
    baseURL string            // base url
    headers map[string]string // headers
}

client:使用 http.Client 發(fā)送 HTTP 請(qǐng)求。

baseURL:基礎(chǔ) URL,便于在請(qǐng)求時(shí)自動(dòng)拼接路徑。

headers:一個(gè)存儲(chǔ) HTTP 請(qǐng)求頭的 map,支持動(dòng)態(tài)設(shè)置。

初始化函數(shù)

func NewCurl(baseURL string, timeout time.Duration) *Curl {
    return &Curl{
        client: &http.Client{
            Timeout: timeout,
        },
        baseURL: strings.TrimSuffix(baseURL, "/"),
        headers: make(map[string]string),
    }
}

baseURL:傳入基礎(chǔ) URL。

timeout:設(shè)置超時(shí)時(shí)間。

功能實(shí)現(xiàn)

1. 設(shè)置請(qǐng)求頭

SetHeader 用于設(shè)置 HTTP 請(qǐng)求頭:

func (c *Curl) SetHeader(key, value string) {
    c.headers[key] = value
}

可以通過(guò)如下方式動(dòng)態(tài)設(shè)置請(qǐng)求頭:

curl.SetHeader("Content-Type", "application/json")

2. 構(gòu)建請(qǐng)求

func (c *Curl) buildRequest(ctx context.Context, method, urlPath string, queryParams map[string]string, body io.Reader) (*http.Request, error) {
    // 處理完整的 URL
    fullURL := c.baseURL + urlPath
    if queryParams != nil {
        query := url.Values{}
        for key, value := range queryParams {
            query.Add(key, value)
        }
        fullURL += "?" + query.Encode()
    }

    // 創(chuàng)建請(qǐng)求
    req, err := http.NewRequestWithContext(ctx, method, fullURL, body)
    if err != nil {
        return nil, err
    }

    // 設(shè)置請(qǐng)求頭
    for key, value := range c.headers {
        req.Header.Set(key, value)
    }

???????    return req, nil
}

3. 發(fā)送請(qǐng)求

func (c *Curl) doRequest(req *http.Request) (*http.Response, error) {
    resp, err := c.client.Do(req)
    if err != nil {
        return nil, err
    }
    return resp, nil
}

4. 發(fā)送 GET 請(qǐng)求

Get 方法通過(guò) HTTP GET 請(qǐng)求獲取資源:

func (c *Curl) Get(ctx context.Context, urlPath string, queryParams map[string]string) (*http.Response, error) {
    req, err := c.buildRequest(ctx, http.MethodGet, urlPath, queryParams, nil)
    if err != nil {
        return nil, err
    }
    return c.doRequest(req)
}

示例:

response, err := curl.Get(context.TODO(), "/user", map[string]string{"id": "123"})

5. 發(fā)送 POST 請(qǐng)求

Post 方法通過(guò) HTTP POST 請(qǐng)求提交數(shù)據(jù):

func (c *Curl) Post(ctx context.Context, urlPath string, body []byte) (*http.Response, error) {
    req, err := c.buildRequest(ctx, http.MethodPost, urlPath, nil, bytes.NewBuffer(body))
    if err != nil {
        return nil, err
    }
    return c.doRequest(req)
}

示例:

data := []byte(`{"name":"Alice"}`)
response, err := curl.Post(context.TODO(), "/user", data)

6. 發(fā)送 PUT 請(qǐng)求

Put 方法通過(guò) HTTP PUT 請(qǐng)求更新資源:

func (c *Curl) Put(ctx context.Context, urlPath string, body []byte) (*http.Response, error) {
    req, err := c.buildRequest(ctx, http.MethodPut, urlPath, nil, bytes.NewBuffer(body))
    if err != nil {
        return nil, err
    }
    return c.doRequest(req)
}

示例:

data := []byte(`{"age":30}`)
response, err := curl.Put(context.TODO(), "/user", data)

7. 發(fā)送 DELETE 請(qǐng)求

Delete 方法通過(guò) HTTP DELETE 請(qǐng)求刪除資源:

func (c *Curl) Delete(ctx context.Context, urlPath string) (*http.Response, error) {
    req, err := c.buildRequest(ctx, http.MethodDelete, urlPath, nil, nil)
    if err != nil {
        return nil, err
    }
    return c.doRequest(req)
}

示例:

response, err := curl.Delete(context.TODO(), "/user")

8. 讀取響應(yīng)體

ReadResponseBody 讀取 HTTP 響應(yīng)體并返回字節(jié)數(shù)組:

func ReadResponseBody(resp *http.Response) ([]byte, error) {
    defer func(Body io.ReadCloser) {
        err := Body.Close()
        if err != nil {
            fmt.Printf("close response body failed: %v\n", err)
        }
    }(resp.Body)
    return io.ReadAll(resp.Body)
}

示例:

body, err := ReadResponseBody(response)
if err != nil {
    fmt.Println("Read response body error:", err)
} else {
    fmt.Println("Response body:", string(body))
}

實(shí)現(xiàn)思路

使用 http.NewRequestWithContext 構(gòu)建 HTTP 請(qǐng)求對(duì)象。

通過(guò) client.Do(req) 發(fā)送請(qǐng)求。

動(dòng)態(tài)設(shè)置請(qǐng)求頭,支持不同的 Content-Type。

處理查詢參數(shù),方便 GET 請(qǐng)求傳參。

讀取響應(yīng)體,處理服務(wù)器返回的數(shù)據(jù)。

示例

完整示例

curl := NewCurl("https://example.com", 10*time.Second)
curl.SetHeader("Authorization", "Bearer token")
resp, err := curl.Get(context.TODO(), "/api/resource", map[string]string{"key": "value"})
if err != nil {
    log.Fatalf("Failed to send GET request: %v", err)
}

body, err := ReadResponseBody(resp)
if err != nil {
    log.Fatalf("Failed to read response: %v", err)
}

fmt.Println("Response:", string(body))

總結(jié)

通過(guò)封裝 Curl 結(jié)構(gòu)體,簡(jiǎn)化了 Go 語(yǔ)言中與 HTTP 服務(wù)的交互過(guò)程,提供了靈活的配置和擴(kuò)展能力。通過(guò)這種封裝,可以快速集成 HTTP 請(qǐng)求,減少模板代碼的編寫,提升開發(fā)效率。

到此這篇關(guān)于Go語(yǔ)言封裝HTTP請(qǐng)求的Curl工具包詳解的文章就介紹到這了,更多相關(guān)Go封裝HTTP請(qǐng)求內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語(yǔ)言的互斥鎖的詳細(xì)使用

    Go語(yǔ)言的互斥鎖的詳細(xì)使用

    本文主要介紹了Go語(yǔ)言的互斥鎖的詳細(xì)使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Go語(yǔ)言文件讀寫操作案例詳解

    Go語(yǔ)言文件讀寫操作案例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言文件讀寫操作案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Golang Gorm 更新字段save、update、updates

    Golang Gorm 更新字段save、update、updates

    在gorm中,批量更新操作可以通過(guò)使用Update方法來(lái)實(shí)現(xiàn),本文主要介紹了Golang Gorm 更新字段save、update、updates,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Go處理包含多種引號(hào)的字符串的幾種方法

    Go處理包含多種引號(hào)的字符串的幾種方法

    在Go中,有幾種方式可以處理包含多種引號(hào)的字符串,以確保代碼的可讀性和正確性,本文將給大家詳細(xì)介紹了這幾種處理方式,并通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • Go語(yǔ)言中slice的用法實(shí)例分析

    Go語(yǔ)言中slice的用法實(shí)例分析

    這篇文章主要介紹了Go語(yǔ)言中slice的用法,實(shí)例分析了slice的功能及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go中runtime.Caller的使用

    Go中runtime.Caller的使用

    這篇文章主要介紹了Go中runtime.Caller的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-03-03
  • go語(yǔ)言實(shí)現(xiàn)銀行卡號(hào)Luhn校驗(yàn)

    go語(yǔ)言實(shí)現(xiàn)銀行卡號(hào)Luhn校驗(yàn)

    這篇文章主要為大家介紹了go語(yǔ)言Luhn校驗(yàn)測(cè)試銀行卡號(hào)碼的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 基于Golang?container/list實(shí)現(xiàn)LRU緩存

    基于Golang?container/list實(shí)現(xiàn)LRU緩存

    Least?Recently?Used?(LRU)?,即逐出最早使用的緩存,這篇文章主要為大家介紹了如何基于Golang?container/list實(shí)現(xiàn)LRU緩存,感興趣的可以了解下
    2023-08-08
  • 如何使用Goland IDE go mod 方式構(gòu)建項(xiàng)目

    如何使用Goland IDE go mod 方式構(gòu)建項(xiàng)目

    這篇文章主要介紹了如何使用Goland IDE go mod 方式構(gòu)建項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 深入理解Go中rune類型的使用

    深入理解Go中rune類型的使用

    本文主要介紹了深入理解Go中rune類型的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-02-02

最新評(píng)論

秭归县| 樟树市| 徐州市| 沙河市| 红安县| 扶余县| 新野县| 云南省| 长春市| 成武县| 从江县| 台南县| 大竹县| 弥勒县| 区。| 瑞金市| 沈丘县| 玛沁县| 昭觉县| 银川市| 会宁县| 内丘县| 略阳县| 湘潭市| 海宁市| 赤城县| 都匀市| 荆州市| 阜新市| 大姚县| 梅州市| 平武县| 宁波市| 姚安县| 梁山县| 镇原县| 寻乌县| 锡林郭勒盟| 宁城县| 洞头县| 焦作市|