4

BasicAuth で単純な HTTP get を実行しようとしています。問題は、URL をコマンドラインの cURL 要求にコピー アンド ペーストして正常に動作するにもかかわらず、応答が「404」を返し続けることです。

const url string = "http://1.2.3.4:6710/REST/command"
const username string = "..."
const password string = "..."

fmt.Printf("\n%v\n", url)

client := &http.Client{}

req, _ := http.NewRequest("GET", url, nil)
req.SetBasicAuth(username, password)
req.Proto = "HTTP/1.0"
req.ProtoMinor = 0

resp, _ := client.Do(req)

fmt.Printf("\n%v\n", resp)

defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)   

fmt.Printf("\n%v\n\n", string(body))

したがって、すぐに印刷していることがわかります。urlこれは、コマンドラインの cURL 要求にコピーすると、すべてが完全に機能するのと同じテキスト行です。

私のリクエストレスポンスは

&{404 Not Found 404 HTTP/1.0 1 0 map[Pragma:[no-cache] Date:[Wed, 17 Apr 2013 15:01:33 GMT] Connection:[close] Server:[MoneyWorks_Datacentre/6.1.3 Win-x86 REST/6.1.3] Cache-Control:[no-store, no-cache, must-revalidate] Expires:[Wed, 17 Apr 2013 15:01:33 GMT]] 0xf8400e3920 -1 [] true map[] 0xf8400aa000}

cURL がそのような単純な要求を処理する方法とは異なる、golang の HTTP 関数に固有のものはありますか?

EDIT:URLをに渡すことで機能していますexec.Command("curl", url).Output()。明らかに、これは私が望んでいるネイティブ ソリューションではありませんが、現時点では機能します。

4

2 に答える 2

3

問題はユニコード関連でした。%2F私のコマンドには (元の質問には表示されていません) があり、Go はそのままにして/おく必要がありました%2F(cURL は適切に のままにしていました%2F)。を変更して問題%2F%252F修正しました。

また、新しい HTTP リクエストを作成するときに、Go は Unicode を解析してプレーン テキストに戻すように見えるため%3D、HTTP リクエスト イニシャライザに送信する URL にある場合は、それを に変換し=ます。%253D明らかな解決策はURLに入れることだと思いましたが、どうやら Go には に変換されるが に変換%3Dされ=ないバグがある%25よう%です。これを回避するには、不透明な URL リクエスト ( request.Url.Opaque) を使用する必要がありました。

于 2013-06-26T14:23:57.237 に答える