目录

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