Golang Go语言中使用net/http对网站多次发起请求,哪种方式更合适呢?
Golang Go语言中使用net/http对网站多次发起请求,哪种方式更合适呢?
第一种,建立多个 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 中需要的信息
}
这两种方式哪种更合适呢?
更多关于Golang Go语言中使用net/http对网站多次发起请求,哪种方式更合适呢?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
第一种 直观
更多关于Golang Go语言中使用net/http对网站多次发起请求,哪种方式更合适呢?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
只请求个一两次还好,如果请求个五六次,就要设置五六次 header,没有更好的方法了吗?
可以写个循环啊…
另外 header 是可以弄成一个 map 的
是的,可以直接设置创建一个 map。go<br>type Header map[string][]string<br>
学习了,还是一次请求一个 request 更可靠。
在Golang中使用net/http
包对网站多次发起请求时,选择合适的方式主要取决于具体需求,如并发性、请求数量、错误处理以及性能要求等。以下是几种常见的方法及其适用场景:
-
同步请求:适用于请求数量较少,或对请求顺序有严格要求的情况。使用
http.Get
或http.Post
等函数逐个发起请求,并等待每个请求完成后再进行下一步操作。 -
goroutines与channel:对于大量请求且需要并发处理的情况,可以使用goroutines来并发发起请求,并使用channel来收集结果。这种方法可以显著提高性能,但需要注意goroutine的数量控制,避免创建过多goroutine导致系统资源耗尽。
-
http.Client的Do方法:通过创建一个
http.Client
实例,并使用其Do
方法发起请求,可以更灵活地设置请求头、超时等参数。同时,http.Client
也支持并发请求,但同样需要注意资源控制。 -
第三方库:如
colly
等爬虫框架,封装了net/http
的功能,提供了更高级别的抽象和错误处理机制,适合构建复杂的爬虫应用。
在选择具体方式时,建议根据实际需求进行权衡。对于简单的请求,同步方式可能足够;而对于复杂的并发请求场景,使用goroutines和channel或第三方库可能更为合适。同时,务必注意错误处理和资源释放,以避免潜在的问题。