1.摘要
go项目在传参调用时,避免不了要在参数中有几个特殊字符,本文可告诉大家,Golang中对字符串进行URL编码的方法,将包含不可打印、保留或非ascii字符的字符串转换为可以在internet上传输的普遍接受的格式。避免大家入坑。
2.具体使用
在使用go的http-client时,传输了一堆的参数,如下文所示,最后发现下游服务无法接受该参数。
{
"csdn": "杰哥的技术杂货铺",
"emsCnpl": "杰哥的技术杂货铺",
"contactWay": "jemooer",
"remark": "杰哥的技术杂货铺100%干货"
}
发现该参数在服务request前,依然存在,但是下游服务始终无法接收,经过排查发现http-client中有这样一段源码:
<!--检查响应体长度。 关闭上一个响应体。但至少要读一些正文,这样如果它很小,底层的TCP连接就会被重用。
无需检查错误:如果失败,Transport无论如何也不会重用它-->
const maxBodySlurpSize = 2 << 10
if resp.ContentLength == -1 || resp.ContentLength <= maxBodySlurpSize {
// 从 响应体 复制maxBodySlurpSize 个字节,它返回复制的字节
io.CopyN(ioutil.Discard, resp.Body, maxBodySlurpSize)
}
当时以为是:request函数因为body过大,丢弃请求Body了。
经过大佬协助,发现是参数格式问题,需要进行URL编码,以下是golang实现URL编码的几种方案:
URL编码字符串
Go的net/url包内有一个名为QueryEscape的内置方法来转义/编码一个字符串,这样它就可以安全地放在URL查询中。下面的示例演示如何在Golang -中对查询字符串进行编码。
- 代码:
package main
import (
"fmt"
"net/url")func main() {
query := "杰哥的技术杂货铺100%干货"
fmt.Println(url.QueryEscape(query))
}
- 输出内容:
%E6%9D%B0%E5%93%A5%E7%9A%84%E6%8A%80%E6%9C%AF%E6%9D%82%E8%B4%A7%E9%93%BA100%25%E5%B9%B2%E8%B4%A7
对多个查询参数的编码
如果希望同时对多个查询参数进行编码,则可以创建 url.Values 由查询参数到值的映射组成,并使用url.Values.Encode()方法对所有查询参数进行编码。
举例代码:
package main
import (
"fmt"
"net/url")func main() {
params := url.Values{}
params.Add("csdn", "@杰哥的技术杂货铺")
params.Add("contactWay", "+jemooer")
fmt.Println(params.Encode())
}
- 输出内容:
contactWay=%2Bjemooer&csdn=%40%E6%9D%B0%E5%93%A5%E7%9A%84%E6%8A%80%E6%9C%AF%E6%9D%82%E8%B4%A7%E9%93%BA
对URL路径编码
与QueryEscape一样,Go中的net/url包也有另一个名为PathEscape()的函数,用于对字符串进行编码,以便将其安全地放置在URL的路径段中。
- 代码举例:
package main
import (
"fmt"
"net/url")
func main() {
path := "https://blog.csdn.net/cljdsc?spm=1019.2139.3001.5343"
fmt.Println(url.PathEscape(path))
}
- 输出内容:
https:%2F%2Fblog.csdn.net%2Fcljdsc%3Fspm=1019.2139.3001.5343
通过编码各个部分来构建完整的URL
最后,让我们看一个完整的例子,在Golang中进行URL解析和编码。
package main
import (
"fmt"
"net/url")
func main() {
// base url
baseUrl, err := url.Parse("https://blog.csdn.net")
if err != nil {
fmt.Println("Malformed URL: ", err.Error())
return
}
// 添加query string参数
baseUrl.Path += "/cljdsc?spm=1019.2139.3001.5343"
// 参数准备
params := url.Values{}
params.Add("q", "Hello Golang")
params.Add("u", "@jemooner")
// 附加query string到url上
baseUrl.RawQuery = params.Encode()
fmt.Printf("Encoded URL is %q\n", baseUrl.String())
}
- 输出内容:
Encoded URL is "https://blog.csdn.net/cljdsc%3Fspm=1019.2139.3001.5343?q=Hello+Golang&u=%40jemooner"
3.写在最后
本文由部分到整体,详细讲解了Golang中Url编码的使用方法,当然,关于Url编码的使用还有更多内容可查看:https://pkg.go.dev/net/url
以上,就是今天分享的全部内容了。
希望大家通过以上方式可以解决自己的实际需求,解决自己目前所遇到的问题。
如果在开发过程中有任何疑问,可以联系我,加入技术交流群,与更多的技术大佬学习交流。
原创不易,码字不易。 觉得这篇文章对你有点用的话,麻烦你为本文点个赞,留言或转发一下,因为这将是我输出更多优质文章的动力,感谢!