来自Golang的认证HTTP客户端请求

33

我有如下代码:

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拒绝访问错误。另一个REST客户端(一个火狐浏览器插件)可以正确地从服务器获取详细信息,所以我知道服务器方面没有问题。我需要传递一些会话字符串或者我们在之前请求中得到的某些东西吗?

3个回答

25

好的,我已经解决了这个问题。我只需要创建一个cookie jar。

我感到惊讶的是,golang http请求/客户端类默认情况下没有处理这个问题。

我需要使用的代码是:

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]
}

然后在主函数中:

    jar := &myjar{}
    jar.jar = make(map[string] []*http.Cookie)
    client.Jar = jar

工作正常。


14

使用HTTP基本身份验证,每个请求都需要凭据。尝试复制

req.SetBasicAuth("<username>", "<password>")

第二个客户端.Do(req)之前的那行代码。

Firefox插件能够获取这些细节是因为浏览器会缓存HTTP基本身份验证令牌以供后续使用。


这个方法验证密码是否正确吗?在我的情况下,当我传递错误的密码时,它会悄悄地失败。 - laimison
我可以回答自己的问题。这可以通过 resp, err = client.Do(req)defer resp.Body.close()if resp.StatusCode != 200 { log.Fatal("HTTP response code is not 200") } 来解决。因此,可以使用这种方法跟踪响应。 - laimison

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接