Go语言中http.NewRequest将单引号转义为%27的问题求助
解决Go中HTTP请求URL单引号被自动编码的问题
我之前也碰到过类似的情况,其实这是Go的net/http包在处理URL时的默认行为——它会严格遵循RFC 3986规范,对URL中的特殊字符进行自动编码,单引号'就属于被编码的范畴,所以会被转成%27。
为什么会自动编码?
根据RFC 3986的定义,单引号'属于"sub-delims"子分隔符,虽然在一些场景下可以不编码,但Go的URL解析器为了保证URL的合规性,默认会对这类字符进行编码转换。
如何保留原单引号?
要绕过自动编码,我们可以手动构造url.URL结构体,直接指定Path和RawQuery字段,这样Go就不会对我们预先拼接好的内容进行编码处理:
package main import ( "net/http" "net/url" ) func main() { root_folder_url := "rooturl" // 手动构造完整的URL结构 targetURL := &url.URL{ Scheme: "http", Host: "domain", Path: "/_api/Web/GetFolderByServerRelativeUrl('" + root_folder_url + "')", RawQuery: "$expand=Folders,Files", } // 基于构造好的URL创建请求 req, err := http.NewRequest("GET", targetURL.String(), nil) if err != nil { // 这里添加错误处理逻辑 panic(err) } // 此时打印req.URL.String()就能看到保留单引号的URL了 println(req.URL.String()) }
注意事项
- 这种方法需要你确保
root_folder_url本身不包含其他需要编码的特殊字符,如果有,你需要手动对这些字符进行编码(比如用url.PathEscape处理路径部分的特殊字符,但跳过单引号),否则可能导致URL无效。 - 虽然保留单引号符合你的需求,但要确认目标服务器能够正确解析带单引号的URL,有些服务器可能只接受编码后的格式。
内容的提问来源于stack exchange,提问作者vkc
相关产品推荐
相关产品推荐

