Golang中URL含大括号触发Bad Request 400错误的解决方法咨询
解决Go中带大括号的URL请求400错误的问题
这个问题我之前也碰到过!核心原因就是Go和Python的HTTP库对URL编码的处理逻辑不一样:Python的requests库会自动帮你处理查询参数里的特殊字符编码,但Go标准库的net/http不会——它只会校验基础URL的格式是否合法,不会主动编码查询参数里的{、}这类特殊符号,这就导致服务器收到的请求不符合URL规范,返回400错误。
下面给你两种靠谱的解决办法:
方法1:手动编码查询参数(快速解决)
你可以用url.QueryEscape()函数单独对包含特殊字符的查询值进行编码,再拼接成完整URL:
package main import ( "net/http" "net/url" "time" ) func main() { // 先把带特殊字符的查询内容编码 rawQuery := "since:{2018-01-01 00:00:00.000}+AND+until:{2018-01-01 22:59:59.999}" encodedQuery := url.QueryEscape(rawQuery) fullURL := "https://git.eclipse.org/r/changes/?q=" + encodedQuery client := &http.Client{Timeout: time.Second * 10} response, err := client.Get(fullURL) if err != nil { // 这里根据你的业务需求处理错误,比如打印日志或者返回错误 panic(err) } defer response.Body.Close() // 后续处理响应内容 }
方法2:用url.URL结构体构建URL(更规范推荐)
如果你的URL参数比较复杂,推荐用Go的url.URL结构体来构建,它会自动帮你处理所有参数的编码,避免手动拼接的失误:
package main import ( "net/http" "net/url" "time" ) func main() { // 先解析基础URL baseURL, err := url.Parse("https://git.eclipse.org/r/changes/") if err != nil { panic(err) } // 构建查询参数集合 queryParams := url.Values{} queryParams.Add("q", "since:{2018-01-01 00:00:00.000}+AND+until:{2018-01-01 22:59:59.999}") // 自动编码所有参数并设置到URL中 baseURL.RawQuery = queryParams.Encode() client := &http.Client{Timeout: time.Second * 10} response, err := client.Get(baseURL.String()) if err != nil { panic(err) } defer response.Body.Close() // 后续处理响应 }
为什么这样能解决问题?
url.QueryEscape()和url.Values.Encode()都会把URL中不允许的特殊字符(比如{→%7B,}→%7D,空格→%20)转换成符合RFC标准的编码格式,这样服务器就能正确解析你的查询参数,不会返回400错误了。
内容的提问来源于stack exchange,提问作者Michael Dorner
相关产品推荐
相关产品推荐

