Golang中进行Url编码,再也不怕奇奇怪怪的参数格式了

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

以上,就是今天分享的全部内容了。

希望大家通过以上方式可以解决自己的实际需求,解决自己目前所遇到的问题。

如果在开发过程中有任何疑问,可以联系我,加入技术交流群,与更多的技术大佬学习交流。

原创不易,码字不易。 觉得这篇文章对你有点用的话,麻烦你为本文点个赞,留言或转发一下,因为这将是我输出更多优质文章的动力,感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰哥的技术杂货铺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值