为什么 url.Parse 不填充 URL.RawPath?

虽然输入类似,但 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())


凤凰求蛊
浏览 236回答 1
1回答

互换的青春

请注意,这URL.RawPath不是原始(转义)路径。可能是,但并非总是如此。这只是一个提示。它的文档说:RawPath    string // encoded path hint (Go 1.5 and later only; see EscapedPath method)因此,当您需要转义路径时,请始终使用URL.EscapedPath()并且不要依赖该URL.RawPath字段。文档URL.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())输出(在Go Playground上试试):Path:        /foo%fbarRawPath:     EscapedPath: /foo%25fbarRawQuery:    q=morefoo%25barString:      https://example.com/foo%25fbar?q=morefoo%25barRawPath是空字符串(因为"/foo%25fbar"是无效的转义路径),但EscapedPath()会返回原始的转义路径。
打开App,查看更多内容
随时随地看视频慕课网APP