在網頁開發上, 處理 query stirng 是非常常見的情境, 要手動拆組 query string 也不難, 或是使用 .NET 本身就提供的相關功能讓這件事更輕鬆, 而兩種做法各有優缺點.
手動拆組
最直覺的方法就是手動拆組字串, 例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| static void HandleQueryString() { var queryString = "?q1=v1&q2=v2&q3=v3";
if (queryString.StartsWith("?")) { queryString = queryString.Remove(0, 1); }
var splitedQueryString = queryString .Split('&') .ToDictionary(r => r.Split('=')[0], v => v.Split('=')[1]);
var queryDic = new Dictionary<string, string>() { ["q1"] = "v1", ["q2"] = "v2", ["q3"] = "v3" };
var formatedQueryString = queryDic .Select(r => $"{r.Key}={r.Value}") .Aggregate((left, right) => $"{left}&{right}"); }
|
手動拆組 query string 常常還要考慮拿到的 query string 前面有沒有多帶問號, 常用的話還要另外抽出來當共用方法, 比較麻煩但相對的很直覺, 且比較不會遇到編碼問題.
HttpUtility.ParseQueryString
如果不想手動拆組字串的話, 可以用 HttpUtility.ParseQueryString() 來處理 query string, 例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| static void HandleQueryStringEasier() { var queryString = "?q1=v1&q2=v2&q3=v3"; var splitedQueryString = HttpUtility.ParseQueryString(queryString);
var query = HttpUtility.ParseQueryString(string.Empty); query["q1"] = "v1"; query["q2"] = "v2"; query["q3"] = "v3"; var formatedQueryString = query.ToString(); }
|
這樣做輕鬆很多, 但如果 query string 裡面有中文字或特殊符號的時候容易衍生出編碼相關的問題, 類似的編碼轉換問題在 HttpRequest.QueryString 的自動 UrlDecode 問題 這篇也有提到.
結論
兩種做法都各有優缺, 實務上怎麼做還是得視情況決定, 一般來說我還是會優先選擇 HttpUtility.ParseQueryString, 如果有無法解決的編碼問題再考慮手動拆組.