一、基本介紹
golang是一種快速編譯和部署的語言,它的性能非常好。golang內置的http包是非常強大的,可以輕鬆地實現HTTP(S)的客戶端和伺服器,包括GET和POST等HTTP方法。
http GET是一種最常用的HTTP請求方法之一,可以用於從伺服器獲取信息。golang內置的http包也提供了http GET請求的實現,包括最簡單的GET請求方法和一些高級功能。
下面是一個簡單的http GET請求的示例代碼:
package main import ( "fmt" "net/http" ) func main() { resp, err := http.Get("https://www.google.com") if err != nil { fmt.Println("http get error:", err) return } defer resp.Body.Close() fmt.Println("http status code:", resp.StatusCode) fmt.Println("http proto:", resp.Proto) fmt.Println("http content length:", resp.ContentLength) }
二、GET請求參數
在實際應用中,我們通常需要在GET請求中傳遞一些參數。這些參數可以通過URL的查詢字元串(query string)傳遞,也可以在URL路徑中傳遞。
在golang中,我們可以很方便地使用net/url包構造URL,下面是一個示例代碼:
package main import ( "fmt" "net/http" "net/url" ) func main() { query := url.Values{} query.Set("key1", "value1") query.Set("key2", "value2") url := url.URL{ Scheme: "https", Host: "httpbin.org", Path: "/get", RawQuery: query.Encode(), } resp, err := http.Get(url.String()) if err != nil { fmt.Println("http get error:", err) return } defer resp.Body.Close() fmt.Println("http status code:", resp.StatusCode) fmt.Println("http proto:", resp.Proto) fmt.Println("http content length:", resp.ContentLength) }
三、自定義請求頭
在http請求中,請求頭(header)中包含了一些元數據,如User-Agent、Accept等。某些情況下,我們需要自定義請求頭來修改請求行為,比如模擬某個特定瀏覽器或者請求json格式數據。
在golang中,我們可以通過創建一個http.Request結構體來自定義請求頭,示例代碼如下:
package main import ( "fmt" "net/http" "net/url" ) func main() { query := url.Values{} query.Set("key1", "value1") query.Set("key2", "value2") url := url.URL{ Scheme: "https", Host: "httpbin.org", Path: "/get", RawQuery: query.Encode(), } req, err := http.NewRequest("GET", url.String(), nil) if err != nil { fmt.Println("http new request error:", err) return } req.Header.Set("User-Agent", "Mozilla/5.0") req.Header.Set("Accept", "application/json") resp, err := http.DefaultClient.Do(req) if err != nil { fmt.Println("http get error:", err) return } defer resp.Body.Close() fmt.Println("http status code:", resp.StatusCode) fmt.Println("http proto:", resp.Proto) fmt.Println("http content length:", resp.ContentLength) }
四、超時設置
在某些場景下,我們需要設置http請求的超時時間,以防止請求時間過長導致線程被卡死等問題。
在golang中,我們可以通過設置http.Client的Timeout屬性來實現超時設置。示例代碼如下:
package main import ( "fmt" "net/http" "net/url" "time" ) func main() { query := url.Values{} query.Set("key1", "value1") query.Set("key2", "value2") url := url.URL{ Scheme: "https", Host: "httpbin.org", Path: "/delay/5", RawQuery: query.Encode(), } clt := http.Client{ Timeout: 3 * time.Second, } resp, err := clt.Get(url.String()) if err != nil { fmt.Println("http get error:", err) return } defer resp.Body.Close() fmt.Println("http status code:", resp.StatusCode) fmt.Println("http proto:", resp.Proto) fmt.Println("http content length:", resp.ContentLength) }
五、並發請求
在實際應用中,我們通常需要一次性並發請求多個http介面,以提高請求效率。
在golang中,我們可以使用goroutine和channel來實現並發請求。示例代碼如下:
package main import ( "fmt" "net/http" "net/url" ) func worker(urlCh chan string, resultCh chan string) { for url := range urlCh { resp, err := http.Get(url) if err != nil { resultCh <- fmt.Sprintf("%s: %v", url, err) } else { resultCh <- fmt.Sprintf("%s: %v", url, resp.StatusCode) } } } func main() { urls := []string{ "https://www.google.com", "https://www.baidu.com", "https://www.sina.com.cn", } urlCh := make(chan string, len(urls)) resultCh := make(chan string, len(urls)) for i := 0; i < 3; i++ { go worker(urlCh, resultCh) } for _, url := range urls { urlCh <- url } close(urlCh) for i := 0; i < 3; i++ { fmt.Println(<-resultCh) } }
六、總結
本文詳細介紹了golang http GET請求的基本用法,包括請求參數、自定義請求頭、超時設置和並發請求等。通過本文的學習,讀者可以更好地了解和使用golang內置的http包,並在實際應用中發揮出更好的作用。
原創文章,作者:FATOL,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/333549.html