go 如何正确的构造 url 参数避免参数乱码
目录
Go语言URL编码实战:QueryEscape与Values用法详解
避免参数乱码!Go URL编码核心技巧解析
go 如何正确的构造 url 参数,避免参数乱码
问题
典型场景:http get 请求,需要构造请求参数:
// 构造含中文的API请求
params := map[string]string{
"q": "Go语言",
"page": "2",
}
// 直接拼接的隐患
url := fmt.Sprintf("http://api.com?q=%s&page=%s", params["q"], params["page"])
// 实际生成:http://api.com?q=Go语言&page=2 ❌ 非法字符
func NewClientUrlPath(u string, arg map[string]string) string {
val := url.Values{}
for k, v := range arg {
val.Add(k, v)
}
body := val.Encode()
return fmt.Sprintf("%s?%s", u, body)
}
func TestNewClientUrlPath(t *testing.T){
url:=NewClientUrlPath("http://ip:port/v1",map[string]string{
"name":"******",
"age":"18"
})
//url=http://ip:port/v1?name=******&&age=18
}
一、方案一:url.QueryEscape(基础版)
func main() {
original := "Golang & 编码测试!"
encoded := url.QueryEscape(original)
fmt.Println(encoded)
// 输出:Golang+%26+%E7%BC%96%E7%A0%81%E6%B5%8B%E8%AF%95%21
}
特性:
- 空格转义为
+
- 保留字符如
&
转义为%26
- 中文字符UTF-8编码
二、方案二:url.Values(结构化参数)
params := url.Values{}
params.Add("search", "Go 开发")
params.Add("sort", "desc")
fmt.Println(params.Encode())
// 输出:search=Go+%E5%BC%80%E5%8F%91&sort=desc
优势:
- 自动处理多个参数
- 支持重复键值对
- 内置排序保证可预测性
三、方案三、自定义编码器(特殊需求)
func CustomEncode(s string) string {
return strings.ReplaceAll(
url.QueryEscape(s),
"+", "%20", // 强制空格转%20
)
}
// 输出:Go%20%E5%BC%80%E5%8F%91