GoLang 中几种http请求方式
使用net/http包的函数
GET请求
1 2 3 |
利用http.client结构体来请求
1 2 3 4 |
使用http.NewRequest函数
1 2 3 4 5 | / / 然后http.client 结构体的 Do 方法 / / http.DefaultClient可以换为另外一个http.client resp, err : = http.DefaultClient.Do(req) |
Go的get请求表面有好几种方式,实则只有一种:
1、使用http.NewRequest函数获得request实体
2、利用http.Client结构体的Do方法,将request实体传入Do方法中
POST请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import ( "net/http" "net/url" ) 第一种 data : = url.Values{ "start" :{ "0" }, "offset" :{ "xxxx" }} body : = strings.NewReader(data.Encode()) 第二种 data : = make(url.Values) data[ "params1" ] = []string{ "1" } 第三种 var r http.Request r.ParseForm() r.Form.Add( "params1" , "1" ) body : = strings.NewReader(r.Form.Encode()) |
使用实例化http.Client的post方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import ( "net/http" "net/url" ) 第一种 data : = url.Values{ "start" :{ "0" }, "offset" :{ "xxxx" }} body : = strings.NewReader(data.Encode()) clt : = http.Client{} 第二种 var r http.Request r.ParseForm() r.Form.Add( "params1" , "1" ) body : = strings.NewReader(r.Form.Encode()) clt : = http.Client{} 第三种 data : = url.Values{ "start" :{ "0" }, "offset" :{ "xxxx" }} clt : = http.Client{} |
使用http.NewRequest函数
其实不管是get方法或post方法,所有的get、post的http 请求形式,最终都是会调用net/http包的NewRequest函数,多种多样的请求形式,也仅仅是封装的不同而已。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import ( "net/http" "net/url" ) data : = url.Values{ "start" :{ "0" }, "offset" :{ "xxxx" }} body : = strings.NewReader(data.Encode()) req, err : = http.NewRequest( "POST" , "xxxxx" , body) req.Header. Set ( "Content-Type" , "application/x-www-form-urlencoded" ) / / 此处还可以写req.Header. Set ( "User-Agent" , "myClient" ) req.Header.Add( "Content-Type" , "application/x-www-form-urlencoded" ) clt : = http.Client{} clt.Do(req) |
注意:
在添加header的时候,req.Header.Add和req.Header.Set都可以,但是在修改操作的时候,只能使用req.Header.Set。
这两个方法是有区别的,Golang底层Header的实现是一个map[string][]string,req.Header.Set方法如果原来Header中没有值,那么是没问题的,如果有值,会将原来的值替换掉。而req.Header.Add的话,是在原来值的基础上,再append一个值,如:原来header的值是“s”,我后req.Header.Add一个”a”的话,变成了[s a]。但是,获取header值的方法req.Header.Get确只取第一个,所以如果原来有值,重新req.Header.Add一个新值的话,req.Header.Get得到的值不变。
cookie使用
GoLang中提供了net/http/cookiejar的包
1 2 3 4 5 6 7 8 | jar, err : = cookiejar.New(nil) / / 这里的cookies是[] * http.Cookie jar.SetCookies(url, cookies) Clt : = http.Client{Transport:nil, Jar:jar} Clt.Get( "xxxxx" ) |
cookies类型是[] *http.cookie可以自己实例化,有时候也可以从response中直接使用resp.Cookies()拿到。
Golang的cookie是和http.client联系在一起的,作为http.client的一个属性存在。因此,要想在Golang中使用cookie,就必须想办法构造http.client。
代理使用
必须先构造http.client,需要将http.client结构体的一个属性Transport实例化好。
使用环境变量$http_proxy或$HTTP_PROXY作为代理, 如下:
1 2 3 4 5 | / / 从环境变量$http_proxy或$HTTP_PROXY中获取HTTP代理地址 func GetTransportFromEnvironment() (transport * http.Transport) { transport = &http.Transport{Proxy : http.ProxyFromEnvironment} return } |
使用搭建的http代理
1 2 3 4 5 6 7 8 9 10 11 | func GetTransportFieldURL(proxy_addr * string) (transport * http.Transport) { url_i : = url.URL{} url_proxy, error : = url_i.Parse( * proxy_addr) if error ! = nil{ fmt.Println(error.Error()) } transport = &http.Transport{Proxy : http.ProxyURL(url_proxy)} return } |
首先调用函数,拿到对应的transport,即GetTransportFieldURL或者GetTransportFieldURL函数,然后构建自定义的http.client :
1 2 3 4 5 6 | transport : = GetTransportFieldURL(&proxy_addr) clt : = http.Client{Transport:transport} |