一個一直尚未處理的Golang不相容問題
最近我們在把線上系統升級至Go 1.10版本時發現,在我們實現的某些介面中,出現了客戶反饋呼叫失敗提示引數缺失的情況。這種情況我們在測試過程中未能複線,後來經過了解,發現了故障原因為Go 1.10版本升級過程中更改了部分程式程式碼與驗證邏輯導致的。
故障說明
為了方面說明,我們假設我們存在一個要求以application/x-www-urlencoded-form
的Content-Type
提交的表單,在具體的實現過程中,我們採用標準庫net/http
中的ParseForm
方法處理表單,最後獲取結果。
但是在使用過程中,某些開發人員素質不足,從網上檢索部分程式碼複製貼上(如部分Java開發),導致提交multipart/formdata
資料到伺服器進行請求。這個請求方式在ParseForm
處理中是可以被接受的,程式碼會根據Content-Type
進行處理:如果是提供了multipart
的資料,Go內部也會正常處理。
在Go1.10在開發過程中,在ofollow,noindex">
CL70931
中進行了修改,為了相容RFC2388
中檔名稱可選的問題。在修改之後,在使用multipart/formdata
方式提交的表單會被統一識別成檔案,只能通過http.Request.FormFile
方式讀取。這樣就導致我們使用FormValue
讀取表單資料後讀取結果為空。
故障處理
處理方式不礙乎兩種,一種是推動使用者修改自己的程式碼,這種不需要額外修改。
另外一種主要是己方動作,相容Go1.10+版本帶來的問題(或者降級1.9版本)。這裡主要介紹一下第二種方法的處理。
在第二種方法中,我們需要將使用FormValue
讀取的資料更換為FormFile
獲取檔案形式進行獲取。這個可以參考如下虛擬碼進行修改(未處理異常情況,請自行修改):
f, _, err := req.FormFile(key) if err == nil { b, _ := ioutil.ReadAll(f) value = string(b) }
截止目前為止(Go1.10.3),該相容性問題一直尚未處理,大家可以根據自己的情況自行判斷解決方案。