改进 Go 中 HTTP 查询的身份验证处理
问题:
考虑以下代码用于执行带有身份验证的 HTTP 请求:
client := &http.Client{} // Authenticate req, err := http.NewRequest("GET", "http://164.99.113.32/Authenticate", nil) req.SetBasicAuth("<username>", "<password>") resp, err := client.Do(req) if err != nil { fmt.Printf("Error : %s", err) } // Get Details req.URL, _ = url.Parse("http://164.99.113.32/Details") resp, err = client.Do(req) if err != nil { fmt.Printf("Error : %s", err) }
身份验证成功后,尽管服务器端没有问题,但后续对“/Details”的请求失败,并出现 401 拒绝访问错误。
解决方案:
要解决此问题,需要使用 cookie jar 来管理会话信息。 Go 的 HTTP 客户端默认不处理此问题,因此我们必须定义自定义 cookie jar 实现:
type myjar struct { jar map[string] []*http.Cookie } func (p* myjar) SetCookies(u *url.URL, cookies []*http.Cookie) { fmt.Printf("The URL is : %s\n", u.String()) fmt.Printf("The cookie being set is : %s\n", cookies) p.jar [u.Host] = cookies } func (p *myjar) Cookies(u *url.URL) []*http.Cookie { fmt.Printf("The URL is : %s\n", u.String()) fmt.Printf("Cookie being returned is : %s\n", p.jar[u.Host]) return p.jar[u.Host] }
在 main 函数中,初始化自定义 cookie jar 并将其分配给 HTTP 客户端:
jar := &myjar{} jar.jar = make(map[string] []*http.Cookie) client.Jar = jar
通过此实现,后续请求可以成功访问“/Details”端点。
以上是如何在 Go 中处理 HTTP 请求的身份验证 Cookie?的详细内容。更多信息请关注PHP中文网其他相关文章!