前言
我們在寫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包了