go语言基础学习 (五) http请求

本文介绍了如何使用Go语言进行HTTP请求,包括普通请求、带查询参数的GET请求、下载文件、设置请求头、POST表单和JSON数据、上传文件以及利用cookies实现登录状态保持。详细讲解了各个步骤和方法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过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 json JSON数据

// 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.putdelete请求

方式都是一样, 先创建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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值