来自 Go 的经过身份验证的 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) }
这里的问题是第二个 HTTP 调用失败并出现 401 访问被拒绝错误。
为什么会发生这种情况?
原因是第二个请求不包含第一个请求期间获取的会话 cookie。为了解决这个问题,我们需要创建一个 cookie jar 来存储和跨请求重用 cookie。
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 函数中:
jar := &myjar{} jar.jar = make(map[string] []*http.Cookie) client.Jar = jar
进行这些更改后,第二个请求将拥有成功验证身份并从服务器检索详细信息所需的 cookie。
以上是在使用基本身份验证进行初始身份验证后,如何在 Go 中对后续 HTTP 请求进行身份验证?的详细内容。更多信息请关注PHP中文网其他相关文章!