2015/05/09

[C#]クエリ文字列を操作する

このエントリーをはてなブックマークに追加
ご存じ、URLの後ろにくっついてるパラメータをクエリ文字列と言います。

クエリ文字列を扱うときにDictionaryに変換する自作関数をセコセコ作ったり、またくっつけるための関数を作ったり、そういう操作をしていたのですが、HttpUtility.ParseQueryStringメソッドでまるっと操作できるようです。

HttpUtility.ParseQueryStringメソッドを使う

HttpUtility.ParseQueryStringメソッドはクエリ文字列を引数に、NameValueCollectionオブジェクトを返します。
NameValueCollectionは、Dictionary型のようにキーより値が参照できます。
HttpUtility.ParseQueryStringメソッドが返すNameValueCollectionは、ToStringメソッドで、&と=でつなげたクエリ文字列がそのまま返ります。部分的に値を変更して改めてクエリ文字をつくるような操作もお手の物です。

サンプルコード
// using System.Web;
// using System.Collections.Specialized
// ダミーのURLです
string url = "http://www.hogehoge.co.jp/index.htm?var1=%u3042%u3044%u3046%u3048%u304a&var2=abc&var3=12345";
Uri uri = new Uri(url);
string queryString = uri.Query;

Console.WriteLine(queryString);
// ?var1=%25u3042%25u3044%25u3046%25u3048%25u304a&var2=abc&var3=12345

// ①クエリ文字列からNameValueCollectionを生成
NameValueCollection query = HttpUtility.ParseQueryString(queryString,Encoding.UTF8);

// ②クエリの値を確認
foreach(string key in query.Keys){
    Console.WriteLine(key + "=" + HttpUtility.UrlDecode(query[key]));
}
// var1=あいうえお
// var2=abc
// var3=12345

// ③クエリの値を変更
query["var1"] = "かきくけこ";

// ④クエリ文字列を再生成
Console.WriteLine(query.ToString());
// var1=%u304b%u304d%u304f%u3051%u3053&var2=abc&var3=12345

コードの解説
①クエリ文字列からNameValueCollectionを生成
ダミーURLをもとに、HttpUtility.ParseQueryStringメソッドを使用してクエリ文字列からNameValueCollectionを生成します。

②クエリの値を確認
NameValueCollectionオブジェクトに値がどのように格納されているかクエリの値を確認します。

③クエリの値を変更
キー(var1)に対応するクエリの値を変更します。

④クエリ文字を再生成
NameValueCollectionオブジェクトのToStringメソッドを呼び出すと、=と&で結合されたクエリ文字列が生成されます。


NameValueCollectionはSystem.Collections.Specializedというあまり聞きなれない名前空間にあります。
HttpUtility.ParseQueryStringメソッドのために、using System.Web;が必要です。(要System.Web.dll参照)

NameValueCollectionをDictionaryに変換する

NameValueCollectionはDictionaryに似ているのですが、Linqが使えません。
何かとDictionary形式のほうが使い勝手がいいとお考えの人は、変換してあげてください。

Dictionary<string,string> dic = query.Keys.Cast<string>().ToDictionary(n => n, m => query[m]);

それではよきクエリ文字ライフを!

1 件のコメント :

  1. 教えてください."%u3042%u3044%u3046%u3048%u304a"というようなパーセントエンコーディングの規約はどのRFCで規定されているのでしょうか??通常はRFC3986の"2.1. Percent-Encoding"で、'pct-encoded = "%" HEXDIG HEXDIG' とされているので、そちらの記法が一般的と思っていました.

    返信削除