色んな事を書く

シンプルさを極めたエンジニアになりたい

Query Parameter を扱いやすくしたい

Uri class を使えばクエリパラメータの取得は出来るのですが、文字列だとどうしても扱いにくく良い方法はないものかと思っていました。

調べてみたら HttpUtility.ParseQueryString というメソッドがあって、これを使えばクエリパラメータ文字列を NameValueCollection に変換してくれるとのこと。

NameValueCollection を使えば Dictionary Like に扱えるので、使い勝手はよさそうです。例えばこんな感じ。

var col = HttpUtility.ParseQueryString("name=hoge&age=18", Encoding.UTF8);
col.Dump(); // => ICollection (2 items)

col["name"].Dump(); // => hoge

NameValueCollection は ToString を呼び出すと Key-Value のペアをそのまま Query Parameter 形式の文字列にしてくれます。

col.ToString().Dump(); // => name=hoge&age=18

Add や Remove といったメソッドも用意されているし、Value の上書きも出来るので、簡単に Query Parameter の修正が出来ます。

col["name"] = "fuga";
col.Remove("age");
col.Add("birthday", "2000/01/01");

col.ToString().Dump(); // => name=hoge&age=18

これを新しく Query Parameter として使えば良いだけです。

便利だなと思ったもう一点が、URL Encode/Decode もやってくれるところです。 上記の birthday もそのようにしてくれてますね。

HttpUtility.ParseQueryString のドキュメントには下記のような説明が書かれています。

In the returned NameValueCollection, URL-encoded characters are decoded and multiple occurrences of the same query string parameter are listed as a single entry with a comma separating each value.

ちなみに半角スペースは「+」にエンコードされます。