我正在尝试使用下面的代码进行基本的 HTTP 身份验证,但它抛出了以下错误:
2013/05/21 10:22:58 获取 mydomain.com:不支持的协议方案“”退出状态 1
func basicAuth() string { var username string = "foo" var passwd string = "bar" client := &http.Client{} req, err := http.NewRequest("GET", "mydomain.com", nil) req.SetBasicAuth(username, passwd) resp, err := client.Do(req) if err != nil{ log.Fatal(err) } bodyText, err := ioutil.ReadAll(resp.Body) s := string(bodyText) return s }
知道我可能做错了什么吗?
潜在的“问题”是您的网站是否进行了任何重定向……Go-lang 会在重定向时删除您指定的标头。(我必须使用wireshark才能看到这一点!您可以通过右键单击然后“检查元素”并单击网络选项卡在chrome中快速找到)
您需要定义一个重定向函数来重新添加标头。
func basicAuth(username, password string) string { auth := username + ":" + password return base64.StdEncoding.EncodeToString([]byte(auth)) } func redirectPolicyFunc(req *http.Request, via []*http.Request) error{ req.Header.Add("Authorization","Basic " + basicAuth("username1","password123")) return nil } func main() { client := &http.Client{ Jar: cookieJar, CheckRedirect: redirectPolicyFunc, } req, err := http.NewRequest("GET", "http://localhost/", nil) req.Header.Add("Authorization","Basic " + basicAuth("username1","password123")) resp, err := client.Do(req) }
您需要为 NewRequest 指定协议,例如“http://”,请参见此处。
req, err := http.NewRequest("GET", "http://mydomain.com", nil)