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

