亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go語言封裝HTTP請求的Curl工具包詳解

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

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

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

在這個 curl 工具包中,主要定義了一個 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 請求。

baseURL:基礎(chǔ) URL,便于在請求時自動拼接路徑。

headers:一個存儲 HTTP 請求頭的 map,支持動態(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è)置超時時間。

功能實現(xiàn)

1. 設(shè)置請求頭

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

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

可以通過如下方式動態(tài)設(shè)置請求頭:

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

2. 構(gòu)建請求

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)建請求
    req, err := http.NewRequestWithContext(ctx, method, fullURL, body)
    if err != nil {
        return nil, err
    }

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

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

3. 發(fā)送請求

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 請求

Get 方法通過 HTTP GET 請求獲取資源:

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 請求

Post 方法通過 HTTP POST 請求提交數(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 請求

Put 方法通過 HTTP PUT 請求更新資源:

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 請求

Delete 方法通過 HTTP DELETE 請求刪除資源:

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))
}

實現(xiàn)思路

使用 http.NewRequestWithContext 構(gòu)建 HTTP 請求對象。

通過 client.Do(req) 發(fā)送請求。

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

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

讀取響應(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é)

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

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

相關(guān)文章

  • Go語言并發(fā)編程基礎(chǔ)上下文概念詳解

    Go語言并發(fā)編程基礎(chǔ)上下文概念詳解

    這篇文章主要為大家介紹了Go語言并發(fā)編程基礎(chǔ)上下文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 解決老版本goland無法調(diào)試新版本go的問題

    解決老版本goland無法調(diào)試新版本go的問題

    這篇文章主要給大家介紹了如何解決老版本goland無法調(diào)試新版本go的問題,文中通過代碼示例給大家講解的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2023-11-11
  • Golang實現(xiàn)讀取excel文件并轉(zhuǎn)換為JSON格式

    Golang實現(xiàn)讀取excel文件并轉(zhuǎn)換為JSON格式

    本文介紹了如何使用Golang讀取Excel文件并將其轉(zhuǎn)換為JSON格式,通過安裝excelize依賴和創(chuàng)建readExcelToJSON方法,可以實現(xiàn)這一功能,如果需要轉(zhuǎn)換數(shù)據(jù)類型,可以修改相應(yīng)的代碼,需要的朋友可以參考下
    2025-03-03
  • go語言數(shù)據(jù)類型之字符串string

    go語言數(shù)據(jù)類型之字符串string

    這篇文章介紹了go語言數(shù)據(jù)類型之字符串string,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 基于Go+WebSocket實現(xiàn)實時通信功能

    基于Go+WebSocket實現(xiàn)實時通信功能

    在互聯(lián)網(wǎng)應(yīng)用程序中,實時通信是一種非常重要的功能,WebSocket 是一種基于 TCP 的協(xié)議,它允許客戶端和服務(wù)器之間進(jìn)行雙向通信,本文將介紹如何使用 Golang 創(chuàng)建單獨的 WebSocket 會話,以實現(xiàn)實時通信功能,需要的朋友可以參考下
    2023-10-10
  • golang?墻上時鐘與單調(diào)時鐘的實現(xiàn)

    golang?墻上時鐘與單調(diào)時鐘的實現(xiàn)

    本文主要介紹了golang?墻上時鐘與單調(diào)時鐘的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • golang?Strings包使用總結(jié)

    golang?Strings包使用總結(jié)

    Go語言在處理字符串時,strings包提供了豐富的函數(shù),如常用的strings.Contains檢查是否包含子串,strings.Join拼接字符串?dāng)?shù)組,strings.Split切割字符串等,熟悉這些函數(shù)能有效提高編程效率,尤其是在算法競賽或筆試題中
    2021-03-03
  • Go語言開發(fā)保證并發(fā)安全實例詳解

    Go語言開發(fā)保證并發(fā)安全實例詳解

    這篇文章主要為大家介紹了Go語言開發(fā)保證并發(fā)安全實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Go語言之嵌入類型詳解

    Go語言之嵌入類型詳解

    本文詳細(xì)講解了Go語言之嵌入類型,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Go語言中的速率限流策略全面詳解

    Go語言中的速率限流策略全面詳解

    這篇文章主要為大家介紹了Go語言中的速率限流策略全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評論