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

发布时间 2023-12-18 22:07:51作者: 水车

前言

我们在写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请求的唯一分割符;

我们应该怎么办

方案一

顺着官方的约束,官方说不让用,那就不要用了;

方案二(不推荐)

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

方案三

我们自己解析url中的参数,不要使用官方的url包了