GoLang 中几种http请求方式

Admin 2020-09-15 15:13:21 GoLang

使用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")


相关文章
最新推荐