golang中进行url编码,再也不怕奇奇怪怪的参数格式了(代码片段)

杰哥的技术杂货铺 杰哥的技术杂货铺     2022-10-23     680

关键词:

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

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

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

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

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

各种奇奇怪怪乱码出现的原因

查看详情

第04篇:resources资源文件处理,再也不怕找不到文件了。(代码片段)

公众号:西魏陶渊明<br/>一、前言Java的java.net.URL各种URL前缀的标准类和标准处理程序不足以满足所有对低级资源的访问。例如,没有URL可用于访问需要从类路径或相对于ServletContext。于是乎这就给了Spring,封装继承多态,大展身... 查看详情

奇奇怪怪的冒泡排序toj2014:scramblesort

粘贴两个特别简单的冒泡排序2014:ScrambleSortDescriptionInthisproblemyouwillbegivenaseriesoflistscontainingbothwordsandnumbers.Thegoalistosorttheselistsinsuchawaythatallwordsareinalphabeticalorderandallnumbersareinn 查看详情

奇奇怪怪

我觉得,上帝的确是在掷色子。在寒风瑟瑟的2月,即将迎来春季的2月,枯萎的人们已经失去希望的2月,在无比光辉而冰冷的2月,脑子里突然浮起一个气泡:lrh在2017年2月2日晚上复习了概率论和数学期望。又一个气泡:lrh在2016... 查看详情

yolov5奇奇怪怪的错误汇总

文章大纲不同小版本的网络不兼容问题RuntimeError:Theexpandedsizeofthetensor(1)mustmatch...RuntimeError:torch.cat():Sizesoftensorsmustmatchexceptindimension1.Got24and23indimension2(Theoffendingindexis1)训练技巧问题windows下yolo 查看详情

yolov5奇奇怪怪的错误汇总

文章大纲不同小版本的网络不兼容问题RuntimeError:Theexpandedsizeofthetensor(1)mustmatch...RuntimeError:torch.cat():Sizesoftensorsmustmatchexceptindimension1.Got24and23indimension2(Theoffendingindexis1)训练技巧问题multi-scalew 查看详情

jquery取值的一些奇奇怪怪的操作

语法解释:1.$("#select_id").change(function(){//code...});  //为Select添加事件,当选择其中一项时触发2.varcheckText=$("#select_id").find("option:selected").text(); //获取Select选择的Text3.varcheckValue=$("#select 查看详情

面试再也不怕handler了,消息传递机制全解析(代码片段)

...我们在子线程完成耗时的操作之后,需要对界面数据进行更新,又该怎么处理呢?这时候,我们可以使用Handler进行UI更新。值得注意的是,更新UI我们需要把Message发送到主线程持有的MessageQueue,否则程序 查看详情

javascript中的"奇奇怪怪"(代码片段)

filter等方法的隐式转化var list = [1,,2,,0,5,9];console.log(list[1]); // console: undefinedconsole.log(list[1] !== null); // console.log: undefinedlist&nb 查看详情

一些奇奇怪怪的过题思路

最近考了几次试,做完之后发现自己还是缺乏思维精度和深度……在此把一些奇怪的思路记下来……随题意大概就是拿了一堆数取来取去,这些数在一个模数意义下做乘法,求出操作后取值的期望。首先,找到这个模数的原根(... 查看详情

遇到的奇奇怪怪的问题

1无法生成静态文件问题描述:本地环境可以生成静态文件,而测试环境只能生成90%左右,可以确保代码层面没有问题产生原因:测试服务器硬盘用尽2无法使用post提交表单,同样也无法使用ajax中的post方法解决... 查看详情

yolov5奇奇怪怪的错误汇总:版本兼容,模型训练,数据加载,模型加速

文章大纲不同小版本的网络不兼容问题RuntimeError:Theexpandedsizeofthetensor(1)mustmatch...RuntimeError:torch.cat():Sizesoftensorsmustmatchexceptindimension1.Got24and23indimension2(Theoffendingindexis1)训练技巧问题multi-scalewindows下yolov5OSError:[WinError]Thepagingfileistoosma... 查看详情

c.奇奇怪怪的魔法阵(未搞懂)(代码片段)

C.奇奇怪怪的魔法阵题意:n个点m条边,定义集合S为独立集,当且仅当任意x,y∈S,x与y之间没有边。空集也是独立集现在对于每一个点的集合T,有多少子集为独立集设N=0,1,…,n-1,AT=∑S⊂T[S是独立集]A_T=... 查看详情

mysql性能优化的9种姿势,面试再也不怕了(代码片段)

...将表中字段的宽度舍得尽可能小。例如:在定义邮政编码这个字段时,如果将其设置为ch 查看详情

关于sapabap程序中出现的奇奇怪怪的错误

我是一个初学者,最近在编辑ABAP语言报表的时候有时候会出现一些很奇怪的错误,比如附件当中,图片1能正确编译通过的程序,但是我在图片2的红框位置加了一个空格就弹错误而按照语法来说不应该的啊,而且最近在很多程序里面都... 查看详情

缓存穿透缓存雪崩缓存击穿?再也不怕了,你随便问吧(代码片段)

...绍了缓存使用的四种策略,如果能够结合不同的场景进行灵活运用,你已经 查看详情

缓存穿透缓存雪崩缓存击穿?再也不怕了,你随便问吧(代码片段)

...绍了缓存使用的四种策略,如果能够结合不同的场景进行灵活运用,你已经 查看详情

牛客挑战赛53c.奇奇怪怪的魔法阵(状压)(代码片段)

Link我们要求fT=∑S∈T[S为独立集]f_T=\\sum\\limits_S\\inT[S为独立集]fT​=S∈T∑​[S为独立集]考虑集合TTT的最低位二进制位代表的集合是yyy(这个点设为uuu),其他二进制位代表的是xxx那么T=x+yT=x+yT=x+y显然,若SSS集... 查看详情