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

sac*_*h22 1 cookies client http go

我是新来的,有点混淆设置饼干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
Run Code Online (Sandbox Code Playgroud)

我在这里尝试实现的是将其全局声明,以便在设置jar后,后续客户端请求将具有cookie.如果我将它放在任何其他函数中,它将再次设置为nil.

    jar, _ := cookiejar.New(nil)
    client := &http.Client{
      Jar: jar,
    }
Run Code Online (Sandbox Code Playgroud)

如何做到这一点的最佳实践?谢谢.

icz*_*cza 6

http.Client 旨在重用:

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

因此,只需创建/配置一个http.Client,并在您希望cookiejar工作的任何地方重复使用它.

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