通过net/http包实现go语言的http请求
1. GET请求
- 普通请求
1. http.Get方法
...
response, _ := http.Get("http://httpbin.org/get")
...
2. 创建一个request结构体后,使用client类型Do方法执行request
...
request, err := http.NewRequest("GET", "http://httpbin.org/get", nil)
if err != nil {
return
}
response, _ := http.DefaultClient.Do(request)
...
- 带查询参数的get请求
// 先创建一个request结构体
request, err := http.NewRequest("GET", "http://httpbin.org/get", nil)
if err != nil {
return
}
// 新建一个url.Values结构体, 底层是一个map
var params = make(url.Values)
// 添加参数
params.Add("name", "curry")
params.Add("age", "33")
// 设置request.URL.RawQuery,params.Encode()实际是就是 name=curry&age=30
request.URL.RawQuery = params.Encode()
// 请求
resp, err := http.DefaultClient.Do(request)
- 下载文件
url := "http://image/url
r, err := http.Get(url)
if err != nil {
panic(err)
}
defer func() { _ = r.Body.Close() }()
// 创建本地文件
fr, err := os.Create(localFileName)
defer func() { _ = fr.Close() }()
// 通过io.Copy()将body的内容读取到文件中
io.Copy(fr, r.Body)
- 添加请求头header(适用于所有get,post, put, delete请求)
request, err := http.NewRequest("GET", "http://httpbin.org/get", nil)
if err != nil {
return
}
// 直接在Header字段中添加就可以了
request.Header.Add("user-agent", "firefox")
resp , _ := http.DefaultClient.Do(request)
2. post请求
post普通请求
resp, err := http.Post("http://httpbin.org/post", "", nil)
post form表单数据请求
// post请求的数据是存放在请求体Body中
// form表单数据的阻止方式是urlencoded,跟get请求的查询参数一样
// form表单请求的Content-type是 application/x-www-form-urlencoded
// 组织body内容
data := make(url.Values)
data.Add("name", "curry")
data.Add("age", "33")
payload := data.Encode()
// 直接调用http.Post方法, 第一个参数为url,第二个参数为Content-type,第三个参数为Body
resp , _ := http.Post("http://httpbin.org/post",
"application/x-www-form-urlencoded",
strings.NewReader(payload))
或者也可以直接使用http.PostForm方法,实际上对上面的函数进行了一层封装
resp , _ := http.PostForm("http://httpbin.org/post",
url.Values{"name": {"curry"}, "age": {"33"}})
post jsonJSON数据
// json数据请求的Content-type是 application/json
//序列化一个结构体为Json数据
u := struct {
Name string `json:"name"`
Age int `json:"age"`
}{
Name: "curry",
Age: 33,
}
payload, _ := json.Marshal(u)
//创建一个实现Reader接口的结构体
r, _ := http.Post("http://httpbin.org/post",
"application/json",
bytes.NewReader(payload))
post file上传文件
// post请求的原理都一样都是放在请求体Body中,只是数据的组织方式不一样
body := &bytes.Buffer{}
//创建一个multipart的NewWriter
writer := multipart.NewWriter(body)
defer writer.Close()
// 可以写入form表单的字段信息
writer.WriteField("name", "curry")
// 也可以写入文件, 先创建一个文件的writer
uploadWriter, _ := writer.CreateFormFile("score", "score")
// 打开本地文件
localFile, _ := os.Open("score.txt")
defer localFile.Close()
// 拷贝进uploadWriter
io.Copy(uploadWriter, localFile)
// 通过writer.FormDataContentType获取content-type,因为里面有一个随机产生的分隔符
r, _ := http.Post("http://httpbin.org/post",
writer.FormDataContentType(),
body)
3.put和delete请求
方式都是一样, 先创建request结构体, 在用client.Do()方法访问
1. put请求
req, err := http.NewRequest("PUT", "http://httpbin.org/put", nil)
if err != nil {
panic(err)
}
resp, err := http.DefaultClient.Do(req)
2. delete请求
req, err := http.NewRequest(http.MethodDelete, "http://httpbin.org/delete", nil)
if err != nil {
panic(err)
}
r, err := http.DefaultClient.Do(req)
4.通过cookies进行登录保持
通过自己创建的client结构体中,传入一个cookiejar,每次访问一个请求后,下一次请求会带上上一次请求的cookies
jar, _ := cookiejar.New(nil)
client := &http.Client{
Jar: jar,
}
r, _ := client.Get("http://httpbin.org/cookies/set?name=curry")
本文介绍了如何使用Go语言进行HTTP请求,包括普通请求、带查询参数的GET请求、下载文件、设置请求头、POST表单和JSON数据、上传文件以及利用cookies实现登录状态保持。详细讲解了各个步骤和方法的应用。
6831

被折叠的 条评论
为什么被折叠?



