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后端的校验
作者:水车
出处:https://www.cnblogs.com/shuiche/p/17912433.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
推荐一个激活软件下载站:mac.shuiche.cc
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2019-12-18 canvas笔记备忘
2018-12-18 linux extglob模式 和rm反选