Go語言封裝HTTP請求的Curl工具包詳解
在 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)文章
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-03golang?墻上時鐘與單調(diào)時鐘的實現(xiàn)
本文主要介紹了golang?墻上時鐘與單調(diào)時鐘的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07