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

現在、2 番目の http 呼び出しは 401 アクセス拒否エラーで失敗しています。別の REST クライアント (Firefox プラグイン) がサーバーから詳細を正しく取得するため、サーバー側に問題がないことがわかります。ある種のセッション文字列または前のリクエストで取得したものを渡す必要がありますか?

4

3 に答える 3

24

わかった。私はこれを解決しました。クッキージャーを作成する必要がありました。

これが golang http req/client クラスによってデフォルトで処理されないことに驚いています。

私が使用しなければならなかったコードは次のとおりです。

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

動作します。

于 2012-07-06T13:55:17.887 に答える
13

HTTP 基本認証では、すべての要求に資格情報が必要です。をコピーしてみてください

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

2 番目の client.Do(req) の前の行。

Firefox プラグインが詳細を取得する理由は、ブラウザーが後で使用するために HTTP 基本認証トークンをキャッシュするためです。

于 2012-07-06T13:37:49.517 に答える