如何全局设置cookiejar,以便cookie存在于每个http.Client请求中

时间:2018-03-27 09:49:33

标签: http go cookies client

我是新来的,有点混淆设置cookie jar gloabally。我正在使用来自http包的cookiejar,这是我在http.Client中将cookie设置为jar时可用的其他文档的实现。

    jar, _ := cookiejar.New(nil)
    client := &http.Client{
      Jar: jar,
    }
    req, _ := http.NewRequest("GET", request_url, nil)
    q := req.URL.Query()
    q.Add("authtoken", token)
    req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
    req.URL.RawQuery = q.Encode()
    res, _ := client.Do(req)
    defer res.Body.Close() 
    fmt.Println(res.Cookies()) // can see the cookies here

我在这里想要实现的是将其声明为全局声明,这样一旦设置了jar,后续的客户端请求就会有cookie。 如果我把它放在任何其他函数中,它会再次设置为nil。

    jar, _ := cookiejar.New(nil)
    client := &http.Client{
      Jar: jar,
    }

有关如何执行此操作的最佳做​​法? 谢谢。

2 个答案:

答案 0 :(得分:6)

http.Client旨在重复使用:

  

客户端的传输通常具有内部状态(缓存的TCP连接),因此应该重用客户端,而不是根据需要创建。客户可以安全地同时使用多个goroutines。

只需创建/配置http.Client,然后在您希望Cookiejar工作的任何地方重复使用。

如果配置的http.Client不适合您的所有用例,请创建尽可能多的客户端。为了确保使用相同的cookiejar,您可以创建一个客户端“factory”函数,以确保返回的http.Client将设置Jar。

答案 1 :(得分:1)

可撤销(至少你不能强制使用你的客户端)。

最近将客户端注入net / http.DefaultClient。

最明智的是使用icza的解决方案。