问题描述
例如,我有一个 localhost:8080/myAPI?name=Shop & stop #1234
我对 &
也有问题,但至少 &
之后的内容被填充为单独的参数。我写了一些逻辑来管理它。
来到 #
,#
之后的内容根本没有被填充。我正在使用 net/http
库。
有人遇到过类似的问题吗?
解决方法
首先,在 URL 中,&
字符具有特殊含义:它表示查询参数。因此,如果您在 URL 中编码的数据包含 &
字符,则必须转义。 url.QueryEscape()
可以向您展示转义形式的样子:
fmt.Println(url.QueryEscape("Shop & stop "))
它输出:
Shop+%26+stop+
请注意,&
像 %26
一样被转义,并且空格也被替换为 +
符号。
因此您的有效输入 URL 应如下所示:
rawURL := "http://localhost:8080/myAPI?name=Shop+%26+stop+#23452"
使用net/url
包来解析有效的URL,它还支持获取参数值和你要找的片段(片段是{{1 }} 字符):
#
输出:
u,err := url.Parse(rawURL)
if err != nil {
panic(err)
}
fmt.Println(u.Query().Get("name"))
fmt.Println(u.Fragment)
尝试 Go Playground 上的示例。
,字节 &
、#
和空格在 URL 中具有特殊含义。当包含在查询值中时,这些字节必须被转义。
使用 url.Values 创建转义查询:
v := url.Values{}
v.Set("name","Shop & Stop #23452")
q := v.Encode()
u := "http://localhost:8080/myAPI?" + q
fmt.Println(u) // prints http://localhost:8080/myAPI?name=Shop+%26+stop+%2323452
您还可以使用 url.URL 类型而不是字符串连接来构造 URL。
v := url.Values{}
v.Set("name","Shop & Stop #23452")
u := url.URL{Scheme: "http",Host: "localhost:8080",Path: "/myapi",RawQuery: v.Encode()}
s := u.String()
fmt.Println(s) // prints http://localhost:8080/myAPI?name=Shop+%26+stop+%2323452
url 包将 #
编码为 %23
。大多数 http 服务器库会将 %23
解码回 #
。下面是一个使用 Go 的 net/http 包的例子:
name := req.FormValue("name") // name is "Shop & Stop #23452"
Run a complete client and server example on the Go Playground。