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后端的校验
博客中所涉及到的图片都有版权,请谨慎使用