一、基本介紹
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
微信掃一掃
支付寶掃一掃