加载中...

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 @ 2023-12-18 22:04  水车  阅读(94)  评论(0编辑  收藏  举报