net/http
包提供了HTTP客户端和服务端的实现。
Get、Head、Post和PostForm函数发出HTTP/ HTTPS请求。
HTTP协议
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
Get
func main() {
resp, err := http.Get("https://baidu.com")
if err != nil {
fmt.Printf("Get err: %v", err)
return
}
// 使用完关闭response回复主体
defer resp.Body.Close()
var tmp = make([]byte, 1024)
tmp, err = ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("ReadAll resp.Body failed err: %v\n", err)
return
}
fmt.Println(string(tmp))
}
Get带参数不放在url里面
func main() {
params := url.Values{}
params.Set("name", "ok")
params.Set("age", "18")
url, _ := url.Parse("http:127.0.0.1:8080")
url.RawQuery = params.Encode()
urlParse := url.String()
fmt.Println(urlParse)
// 输出 http:127.0.0.1:8080?age=18&name=ok
}
Post
func main() {
urlValues := url.Values{}
urlValues.Add("name", "ok")
urlValues.Add("age", "18")
resp, _ := http.PostForm("http://127.0.0.1",urlValues)
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
另一种写法
func main() {
urlValues := url.Values{
"name":{"ok"},
"age":{"18"},
}
reqBody:= urlValues.Encode()
resp, _ := http.Post("http://www.xxx.com/post", "text/html",strings.NewReader(reqBody))
defer resp.Body.close()
body,_:= ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
添加请求头
通过添加请求头访问手机版百度
func main() {
request, err := http.NewRequest(http.MethodGet, "https://baidu.com", nil)
request.Header.Add("User-Agent", "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Mobile Safari/537.36")
if err != nil {
fmt.Printf("NewRequest failed err: %v\n", err)
return
}
resp, err2 := http.DefaultClient.Do(request)
if err2 != nil {
fmt.Printf("NewRequest failed err2: %v\n", err2)
return
}
defer resp.Body.Close()
s, _ := httputil.DumpResponse(resp, true)
fmt.Printf("%s\n", s)
}