V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
hellos
V2EX  ›  Go 编程语言

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

  •  
  •   hellos · 2018-10-28 18:03:52 +08:00 · 2970 次点击
    这是一个创建于 1978 天前的主题,其中的信息可能已经有所发展或是发生改变。

    第一种,建立多个 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 中需要的信息
    }
    

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

    7 条回复    2018-10-28 21:44:12 +08:00
    petelin
        1
    petelin  
       2018-10-28 18:50:30 +08:00 via iPhone
    第一种 直观
    hellos
        2
    hellos  
    OP
       2018-10-28 19:12:00 +08:00 via Android
    @petelin 只请求个一两次还好,如果请求个五六次,就要设置五六次 header,没有更好的方法了吗?
    huweic
        3
    huweic  
       2018-10-28 19:28:32 +08:00 via Android
    @hellos 可以写个循环啊....
    huweic
        4
    huweic  
       2018-10-28 19:29:31 +08:00 via Android   ❤️ 1
    @hellos 另外 header 是可以弄成一个 map 的
    hellos
        5
    hellos  
    OP
       2018-10-28 21:23:26 +08:00
    @huweic 是的,可以直接设置创建一个 map。
    ```go
    type Header map[string][]string
    ```
    jessynt
        6
    jessynt  
       2018-10-28 21:33:57 +08:00   ❤️ 1
    hellos
        7
    hellos  
    OP
       2018-10-28 21:44:12 +08:00
    @jessynt 学习了,还是一次请求一个 request 更可靠。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5330 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 08:11 · PVG 16:11 · LAX 01:11 · JFK 04:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.