微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我们如何管理 Rest API 查询参数中的“#”

如何解决我们如何管理 Rest API 查询参数中的“#”

我面临着从查询参数中提取完整值的挑战。

例如,我有一个 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。