2013-05-21 42 views
18

我試圖做基本的HTTP認證與下面的代碼,但它拋出以下錯誤:基本HTTP驗證圍棋

2013年5月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 
} 

任何想法,我可能是做錯了什麼?

回答

20

您需要指定NewRequest的協議,例如「http://」,見here

req, err := http.NewRequest("GET", "http://mydomain.com", nil) 
17

潛在的「疑難雜症」是,如果你的網站做任何重定向...去浪將下降對重定向您指定的標頭。 (我必須做wirehark才能看到這個!你可以通過右鍵單擊然後點擊「檢查元素」並點擊網絡選項卡來快速查找)

你會想要定義一個重定向函數,

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) 
} 
+7

非常有用的提示 - 我自己也遇到了同樣的問題。在重定向函數中,您可以執行'req.SetBasicAuth(「username1」,「password123」)'而不是設置標題本身。 – mjturner