URL 查詢字串與編、解碼淺談

問題
🔗工作許久最近才被這個問題搞到,原本已經剛上線的服務提供檔案上傳與下載,不知為何部分檔案無法順利下載。系統邏輯為客戶上傳檔案時,會生成UUID,並把客戶資訊一起寫進DB,同時儲存檔案。下載時則時藉由當下使用者的資訊與檔案UUID,即時產生包含限制時間資訊的JWT,用來派發一次性下載網址。
而JWT則是由前端藉由Query string的方式夾帶在檔案下載的API中呼叫取得檔案,在使用者介面很常發生下載錯誤的問題,但使用Swagger直接呼叫API又能下載成功。
原因
🔗查了許久才發現是URL傳遞參數包含特殊符號的問題。 一般URL若有使用特殊符號,是有不同的含意的。
舉幾個例子:
?
: 一般出現在 URL 的開頭或在路徑與查詢字串之間,用於分隔 URL 的主要部分和查詢參數。在 URL 中,? 之後的部分通常是查詢字串(query string),用於向伺服器傳遞參數和數據。
例如:https://www.example.com/search?query=example
上面的 URL 中 ? 後的 query=example 就是查詢字串,用來傳遞搜尋的參數。
&
: 在 URL 的查詢字串中,用於分隔不同的查詢參數。它允許在同一個 URL 中傳遞多個參數。
例如:https://www.example.com/search?query=example&page=2
在這個例子中,& 用來將 query=example 和 page=2 這兩個查詢參數分開。
=
: 在 URL 的查詢字串中,用於將參數名稱和參數值分隔開來。它將參數名和參數值相連接。
例如:https://www.example.com/search?query=example
在這裡,= 將 query(參數名)和 example(參數值)分隔開來。
若查詢字串夾帶的參數有包含這類的特殊符號,基本上瀏覽器在解析上就會有問題。
還有其他一些有的沒的像是 + 與空格等在使用URL傳遞時都要很小心。
編碼與解碼
🔗所以若還是硬要透過查詢字串傳遞這類特殊字符的資訊時,就可以透過URL 編碼與解碼解決。
以我目前遇到的例子,需使用查詢字串夾帶JWT,JWT裡面必定包含很多特殊字符,這時就可以在後端產生JWT後執行編碼,再回傳前端就能使用正確的API下載檔案了。
範例
:
若夾帶參數為: =hello+world.
沒編碼前使用Query String 夾帶參數瀏覽器就會誤判。
經編碼後為 : %3Dhello%2Bworld.
再回傳給前端,在呼叫時就不會有問題了。
至於後端在接收此參數時,大多數後端框架或語言的 HTTP 請求處理器會自動對 URL 參數進行解碼,但在使用時還是可以先確認一下,避免之後出錯又得花時間除錯...。
結論
🔗很基本簡單的觀念,所以一直以來都沒去搞清楚,害我花了半小時除錯,所以紀錄一下。😎

Alvin
軟體工程師,喜歡金融知識、健康觀念、心理哲學、自助旅遊與系統設計。
相關文章
留言區 (0)
尚無留言