使用 Golang 的 net/http 对一个网站多次发起请求,哪种方式更合适呢?

2018-10-28 18:03:52 +08:00
 hellos

第一种,建立多个 request,并将请求发送出去

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"net/http/cookiejar"
	"strings"
)

func main() {
	//通过 cookiejar 处理 cookie
	jar := cookiejar.New(nil)
	client := http.Client{
		Jar: jar,
	}
	//第一次请求,获取 cookie
	req1, _ := http.NewRequest("GET", "http://a.com", nil)
	req1.Header.Set("Accept", "略...")
	req1.Header.Set("User-Agent", "略...")
	req1.Header.Set("略 1", "略...")
	req1.Header.Set("略 2", "略...")
	client.Do(req1)
	//第二次请求,登录
	req2, _ := http.NewRequest("POST", "http://a.com/login", strings.NewReader("表单内容"))
	req2.Header.Set("Accept", "略...")
	req2.Header.Set("User-Agent", "略...")
	req2.Header.Set("略 1", "略...")
	req2.Header.Set("略 2", "略...")
	client.Do(req2)
	//第三次请求,获取需要的信息
	req3, _ := http.NewRequest("GET", "http://a.com/foo", nil)
	req3.Header.Set("Accept", "略...")
	req3.Header.Set("User-Agent", "略...")
	req3.Header.Set("略 1", "略...")
	req3.Header.Set("略 2", "略...")
	resp, _ := client.Do(req3)
	//获取 resp 中需要的信息
	//省略
}

第二种,建立一个 request,后续修改这个 request,再发送

func main() {
	jar := cookiejar.New(nil)
	client := http.Client{
		Jar: jar,
	}
	//第一次请求,获取 cookie
	req, _ := http.NewRequest("GET", "http://a.com", nil)
	req1.Header.Set("Accept", "略...")
	req1.Header.Set("User-Agent", "略...")
	req1.Header.Set("略 1", "略...")
	req1.Header.Set("略 2", "略...")
	client.Do(req)
	//第二次请求,登录
	//import "net/url"
	//import "io/ioutil"
	req.Method = "POST"
	secondURL, _ := url.Parse("http://a.com/login")
	req.URL = secondURL
	req.Body = ioutil.NopCloser(strings.NewReader("表单内容"))
	client.Do(req)
	//第三次请求,获取需要的信息
	req.Method = "GET"
	thirdURL, _ := url.Parse("http://a.com/foo")
	req.URL = thirdURL
	req.Body = nil
	resp, _ := client.Do(req)
	//获取 resp 中需要的信息
}

这两种方式哪种更合适呢?

3057 次点击
所在节点    Go 编程语言
7 条回复
petelin
2018-10-28 18:50:30 +08:00
第一种 直观
hellos
2018-10-28 19:12:00 +08:00
@petelin 只请求个一两次还好,如果请求个五六次,就要设置五六次 header,没有更好的方法了吗?
huweic
2018-10-28 19:28:32 +08:00
@hellos 可以写个循环啊....
huweic
2018-10-28 19:29:31 +08:00
@hellos 另外 header 是可以弄成一个 map 的
hellos
2018-10-28 21:23:26 +08:00
@huweic 是的,可以直接设置创建一个 map。
```go
type Header map[string][]string
```
jessynt
2018-10-28 21:33:57 +08:00
hellos
2018-10-28 21:44:12 +08:00
@jessynt 学习了,还是一次请求一个 request 更可靠。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/501935

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX