一、基本介绍
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包,并在实际应用中发挥出更好的作用。