go服务get请求中携带分号(;)时报错,获取不到参数的问题

前言#

我们在写get方式的api请求时,有时候会用这样的一种方式携带参数:http://ip:port/a/b?query=key:1;value:2&other=xxx,这里我们注意到 query 一个字段其实是携带了等子字段的,一个是 key, 一个是 value;这在go 1.17版本之前是没有问题的。但是在1.17之后打印警告,在1.20之后,go服务会直接忽略掉携带 分号(😉 的参数

我们可以从go的源码中看到,参数直接被跳过了。

变更原因#

查了一些资料,具体是go1.17因为潜在安全问题修复了url传参识别解析方式,不再将分号作为分隔标识符号。

关于这个问题,在githup的issue中也有一些讨论https://github.com/golang/go/issues/25192

官方给的答复是为了迎合W3C的标准,其次是W3C标准在2017年就建议不用使用分号(;)作为分割符,其次W3C建议将‘&’作为url请求的唯一分割符;

我们应该怎么办#

方案一#

顺着官方的约束,官方说不让用,那就不要用了;我们尽量遵循W3C的标准

方案二(不推荐)#

将go版本保持在1.16,不要再更新了

方案三(推荐)#

前端在组装query参数时,使用 URLSearchParams 对象去组装,会自动将参数进行编码传输,:会被编码成 %3B; 这样就可以跳过go后端的校验

JS URL()和URLSearchParams() API接口详细介绍

posted @   水车  阅读(115)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2019-12-18 canvas笔记备忘
2018-12-18 linux extglob模式 和rm反选
点击右上角即可分享
微信分享提示
主题色彩