Golang Go语言中使用net/http对网站多次发起请求,哪种方式更合适呢?

发布于 1周前 作者 phonegap100 来自 Go语言

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

8 回复

第一种 直观

更多关于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包对网站多次发起请求时,选择合适的方式主要取决于具体需求,如并发性、请求数量、错误处理以及性能要求等。以下是几种常见的方法及其适用场景:

  1. 同步请求:适用于请求数量较少,或对请求顺序有严格要求的情况。使用http.Gethttp.Post等函数逐个发起请求,并等待每个请求完成后再进行下一步操作。

  2. goroutines与channel:对于大量请求且需要并发处理的情况,可以使用goroutines来并发发起请求,并使用channel来收集结果。这种方法可以显著提高性能,但需要注意goroutine的数量控制,避免创建过多goroutine导致系统资源耗尽。

  3. http.Client的Do方法:通过创建一个http.Client实例,并使用其Do方法发起请求,可以更灵活地设置请求头、超时等参数。同时,http.Client也支持并发请求,但同样需要注意资源控制。

  4. 第三方库:如colly等爬虫框架,封装了net/http的功能,提供了更高级别的抽象和错误处理机制,适合构建复杂的爬虫应用。

在选择具体方式时,建议根据实际需求进行权衡。对于简单的请求,同步方式可能足够;而对于复杂的并发请求场景,使用goroutines和channel或第三方库可能更为合适。同时,务必注意错误处理和资源释放,以避免潜在的问题。

回到顶部