2017-06-26 8 views
0

%の後に数字を含むURLにhttp.NewRequest("GET", url , nil)を使用する場合、*は例:https://api.deutschebahn.com/freeplan/v1/journeyDetails/356418%252F128592%252F57070%252F90271%252F80%253fstation_evaId%253D8000261となります)Goはその文字列をURLの "/"にエンコードします。どうすればそれを避けることができますか?URL入力をデコードするhttp.NewRequest()

+0

https://api.deutschebahn.com/freeplan/v1/journeyDetails/356418%252F128592%252F57070%252F90271%252F80%253fstation_evaId%253D8000261 – SparklingWater

+0

だから、実際にエンコードされた要素を持っているURLパスの一部です。あなたがそれを解読するのがなぜ問題なのですか?あなたの最終目標は何ですか? – Flimzy

+0

リクエストがこのようなものであるため、1/journeyDetails/244815/84952/449280/143035/80?station_evaId = 8098160この部分を含むURL文字列の場合244815%2F84952%2F449280%2F143035%2F80%3fstation_evaId%3D8098160 これは残念なことに、間違ったリクエストを私に残します。 – SparklingWater

答えて

0

明示的URL構造体のRawPathフィールド設定:Pathフィールドを復号形式で格納されていることを

注:/%47この機能は、このユースケース用documentedある

req := http.NewRequest("GET", "https://api.deutschebahn.com/freeplan/v1/journeyDetails/356418%252F128592%252F57070%252F90271%252F80%253fstation_evaId%253D8000261", nil) 
req.URL.RawPath = "/freeplan/v1/journeyDetails/356418%252F128592%252F57070%252F90271%252F80%253fstation_evaId%253D8000261" 

を%6f%2fは/ Go /となる。結果として、パスのスラッシュが生のURLにスラッシュであったかどうかを知ることは不可能で、%2fでした。この区別はめったに重要ではありませんが、そうである場合、コードはPathを直接使用してはなりません。

Go 1.5では、Pathのエンコードされた形式を保持するRawPathフィールドが導入されました。 Parse関数は、返されるURLにPathとRawPathの両方を設定し、URLのStringメソッドは、Pathの有効なエンコーディングであれば、EscapedPathメソッドを呼び出してRawPathを使用します。

+0

これで私はすぐに問題を解決することができましたが、Url.RawPathを設定してもうまくいきませんでした。代わりに、私はQueryEscape(文字列)関数を使用してURLのその部分をエスケープしました。 – SparklingWater

+0

@ SparklingWater:これはあなたのケースで「うまくいく」かもしれませんが、それは正しい解決策ではありません。 QueryEscapeは、パスエスケープとは異なる規則に従います。 少なくとも、代わりに 'PathEscape()'を使うべきです。適切な解決策を得るには、実際のコードを見て、リクエストがどのように使用されているかを確認するとよいでしょう。 – Flimzy

関連する問題