虽然输入类似,但 URL.RawQuery 似乎已正确填充。
u, err := url.Parse("https://example.com/foo%2fbar")
if err != nil {
log.Fatal(err)
}
fmt.Println(u.Path)
fmt.Println(u.RawPath)
fmt.Println(u.String(), "\n")
u, err = url.Parse("https://example.com/foo%25fbar?q=morefoo%25bar")
if err != nil {
log.Fatal(err)
}
fmt.Println(u.Path)
fmt.Println(u.RawPath)
fmt.Println(u.RawQuery)
fmt.Println(u.String())
Run Code Online (Sandbox Code Playgroud)
请注意,这URL.RawPath不是原始(转义)路径。它可能是,但并非总是如此。这只是一个提示。它的文档说:
RawPath string // encoded path hint (Go 1.5 and later only; see EscapedPath method)
Run Code Online (Sandbox Code Playgroud)
因此,当您需要转义路径时,请始终使用URL.EscapedPath()而不是依赖URL.RawPath字段。Doc ofURL.EscapedPath()说:
当EscapedPath是u.Path的有效转义时,它返回u.RawPath。
这是你的情况。如果原始路径包含在 URL 编码期间需要转义的字节,则该原始路径无效。您的路径就是这样一个示例,因为它包含%25哪个是百分比符号本身的 URL 转义文本,'%'如果 URL 路径的一部分,则需要对百分比符号进行转义。
您包含的第一个示例%2f是斜杠的 URL 转义文本'/',如果存在于路径中,则不需要对其进行转义('/'是路径中的有效字符并被视为分隔符)。
看这个例子:
u, err = url.Parse("https://example.com/foo%25fbar?q=morefoo%25bar")
if err != nil {
log.Fatal(err)
}
fmt.Println("Path: ", u.Path)
fmt.Println("RawPath: ", u.RawPath)
fmt.Println("EscapedPath:", u.EscapedPath())
fmt.Println("RawQuery: ", u.RawQuery)
fmt.Println("String: ", u.String())
Run Code Online (Sandbox Code Playgroud)
输出(在Go Playground上试试):
Path: /foo%fbar
RawPath:
EscapedPath: /foo%25fbar
RawQuery: q=morefoo%25bar
String: https://example.com/foo%25fbar?q=morefoo%25bar
Run Code Online (Sandbox Code Playgroud)
RawPath是空字符串(因为"/foo%25fbar"是无效的转义路径),但EscapedPath()返回原始转义路径。