当前位置: 首页 > news >正文

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

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

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

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

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

相关文章:

  • Linux机器时钟同步
  • Go语言基础 指针 运算符
  • Elasticsearch部署和问题汇总
  • 如何搭建边缘计算盒子IVP02E环境部署?
  • 【Linux私房菜】第八期——面试
  • jest 使用 jest-allure 测试报告
  • navicat连接远程服务器报错代码:10038
  • 笔试题/面试题——WEB前端性能优化,提高页面加载速度
  • CNN-运动鞋品牌识别
  • 可行性研究的任务有哪些?可行性研究包括哪些步骤?
  • 数据湖技术之快速体验 Hudi
  • [Spring Boot 2]整合持久层技术
  • Mysql_存储过程
  • Maven(基础)
  • 【PS小贴士】项目需求汇总——WBS Grouping(2)
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • Android优雅地处理按钮重复点击
  • create-react-app项目添加less配置
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Joomla 2.x, 3.x useful code cheatsheet
  • js如何打印object对象
  • LeetCode18.四数之和 JavaScript
  • VUE es6技巧写法(持续更新中~~~)
  • XML已死 ?
  • 翻译--Thinking in React
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 移动端唤起键盘时取消position:fixed定位
  • 用Visual Studio开发以太坊智能合约
  • Android开发者必备:推荐一款助力开发的开源APP
  • !!java web学习笔记(一到五)
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (WSI分类)WSI分类文献小综述 2024
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (理论篇)httpmoudle和httphandler一览
  • (六)c52学习之旅-独立按键
  • (六)软件测试分工
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • ***利用Ms05002溢出找“肉鸡
  • ***详解账号泄露:全球约1亿用户已泄露
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • // an array of int
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [ Linux ] Linux信号概述 信号的产生
  • [.NET 即时通信SignalR] 认识SignalR (一)