为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
凤凰求蛊 2022-03-07 16:30:05
虽然输入类似,但 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())
查看完整描述

1 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

请注意,这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%fbar

RawPath:     

EscapedPath: /foo%25fbar

RawQuery:    q=morefoo%25bar

String:      https://example.com/foo%25fbar?q=morefoo%25bar

RawPath是空字符串(因为"/foo%25fbar"是无效的转义路径),但EscapedPath()会返回原始的转义路径。


查看完整回答
反对 回复 2022-03-07
  • 1 回答
  • 0 关注
  • 232 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信