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


December 6, 2023 程式語言

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


URL查詢字串傳遞參數時,使用編碼與解碼與該注意的細節。

問題

🔗

工作許久最近才被這個問題搞到,原本已經剛上線的服務提供檔案上傳與下載,不知為何部分檔案無法順利下載。系統邏輯為客戶上傳檔案時,會生成UUID,並把客戶資訊一起寫進DB,同時儲存檔案。下載時則時藉由當下使用者的資訊與檔案UUID,即時產生包含限制時間資訊的JWT,用來派發一次性下載網址。

而JWT則是由前端藉由Query string的方式夾帶在檔案下載的API中呼叫取得檔案,在使用者介面很常發生下載錯誤的問題,但使用Swagger直接呼叫API又能下載成功。

原因

🔗

查了許久才發現是URL傳遞參數包含特殊符號的問題。 一般URL若有使用特殊符號,是有不同的含意的。

舉幾個例子:

  1. ?: 一般出現在 URL 的開頭或在路徑與查詢字串之間,用於分隔 URL 的主要部分和查詢參數。在 URL 中,? 之後的部分通常是查詢字串(query string),用於向伺服器傳遞參數和數據。

例如:https://www.example.com/search?query=example

上面的 URL 中 ? 後的 query=example 就是查詢字串,用來傳遞搜尋的參數。

  1. &: 在 URL 的查詢字串中,用於分隔不同的查詢參數。它允許在同一個 URL 中傳遞多個參數。

例如:https://www.example.com/search?query=example&page=2

在這個例子中,& 用來將 query=example 和 page=2 這兩個查詢參數分開。

  1. =: 在 URL 的查詢字串中,用於將參數名稱和參數值分隔開來。它將參數名和參數值相連接。

例如:https://www.example.com/search?query=example

在這裡,= 將 query(參數名)和 example(參數值)分隔開來。


若查詢字串夾帶的參數有包含這類的特殊符號,基本上瀏覽器在解析上就會有問題。

還有其他一些有的沒的像是 + 與空格等在使用URL傳遞時都要很小心。

編碼與解碼

🔗

所以若還是硬要透過查詢字串傳遞這類特殊字符的資訊時,就可以透過URL 編碼與解碼解決。

以我目前遇到的例子,需使用查詢字串夾帶JWT,JWT裡面必定包含很多特殊字符,這時就可以在後端產生JWT後執行編碼,再回傳前端就能使用正確的API下載檔案了。

範例 :

若夾帶參數為: =hello+world.

沒編碼前使用Query String 夾帶參數瀏覽器就會誤判。

經編碼後為 : %3Dhello%2Bworld.

再回傳給前端,在呼叫時就不會有問題了。

至於後端在接收此參數時,大多數後端框架或語言的 HTTP 請求處理器會自動對 URL 參數進行解碼,但在使用時還是可以先確認一下,避免之後出錯又得花時間除錯...。

結論

🔗

很基本簡單的觀念,所以一直以來都沒去搞清楚,害我花了半小時除錯,所以紀錄一下。😎

Web



Avatar

Alvin

軟體工程師,喜歡金融知識、健康觀念、心理哲學、自助旅遊與系統設計。

相關文章






留言區 (0)



  or   

尚無留言