使用net/http包的函数
GET请求
import "net/http"
...
resp, err := http.Get("http://wwww.ywfuns.com")
利用http.client结构体来请求
import "net/http"
...
clt := http.Client{}
resp, err := clt.Get("http://wwww.ywfuns.com")
使用http.NewRequest函数
req, err := http.NewRequest("GET", "http://www.ywfuns.com", nil)
// 然后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请求
import (
"net/http"
"net/url"
)
第一种
data := url.Values{"start":{"0"}, "offset":{"xxxx"}}
body := strings.NewReader(data.Encode())
request, er := http.Post("http://www.ywfuns.com", "application/x-www-form-urlencoded", body)
第二种
data := make(url.Values)
data["params1"] = []string{"1"}
request, err := http.PostForm("http://www.ywfuns.com", data)
第三种
var r http.Request
r.ParseForm()
r.Form.Add("params1", "1")
body := strings.NewReader(r.Form.Encode())
request, er := http.Post("http://www.ywfuns.com", "application/x-www-form-urlencoded", body)
使用实例化http.Client的post方法
import (
"net/http"
"net/url"
)
第一种
data := url.Values{"start":{"0"}, "offset":{"xxxx"}}
body := strings.NewReader(data.Encode())
clt := http.Client{}
resp, err := clt.Post("http://www.ywfuns.com", "application/x-www-form-urlencoded", body)
第二种
var r http.Request
r.ParseForm()
r.Form.Add("params1", "1")
body := strings.NewReader(r.Form.Encode())
clt := http.Client{}
clt.Post("http://www.ywfuns.com", "application/x-www-form-urlencoded", body)
第三种
data := url.Values{"start":{"0"}, "offset":{"xxxx"}}
clt := http.Client{}
clt.PostForm("http://www.ywfuns.com", data)
使用http.NewRequest函数
其实不管是get方法或post方法,所有的get、post的http 请求形式,最终都是会调用net/http包的NewRequest函数,多种多样的请求形式,也仅仅是封装的不同而已。
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的包
url, err := url.Parse("https://www.ywfuns.com/")
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作为代理, 如下:
//从环境变量$http_proxy或$HTTP_PROXY中获取HTTP代理地址
func GetTransportFromEnvironment() (transport *http.Transport) {
transport = &http.Transport{Proxy : http.ProxyFromEnvironment}
return
}
使用搭建的http代理
proxy_addr := "http://127.0.0.1:8080"
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 :
proxy_addr := "http://127.0.0.1:8080"
transport := GetTransportFieldURL(&proxy_addr)
clt := http.Client{Transport:transport}
clt.Get("http://www.ywfuns.com")