コードから Web リソースを呼び出すときの一般的なタスクは、必要なすべてのパラメータを含むクエリ文字列を構築することです。決して難しいことではありませんが、&
最初のパラメータではなく if を追加する、パラメータをエンコードするなど、注意が必要な細かい点がいくつかあります。
これを実行するコードは非常にシンプルですが、少し面倒です。
StringBuilder SB = new StringBuilder();
if (NeedsToAddParameter A)
{
SB.Append("A="); SB.Append(HttpUtility.UrlEncode("TheValueOfA"));
}
if (NeedsToAddParameter B)
{
if (SB.Length>0) SB.Append("&");
SB.Append("B="); SB.Append(HttpUtility.UrlEncode("TheValueOfB")); }
}
これは非常に一般的なタスクなので、よりエレガントで読みやすいユーティリティ クラスが存在することを期待します。MSDN をスキャンしましたが、そのようなクラスは見つかりませんでした。そこで、次の疑問が生じます。
上記のことを実行する最もエレガントでクリーンな方法をご存知ですか?
ベストアンサー1
HttpValueCollection
を呼び出しての新しい書き込み可能なインスタンスを作成しSystem.Web.HttpUtility.ParseQueryString(string.Empty)
、それを any として使用することNameValueCollection
ができます。必要な値を追加したら、ToString
次のようにコレクションを呼び出してクエリ文字列を取得できます。
NameValueCollection queryString = System.Web.HttpUtility.ParseQueryString(string.Empty);
queryString.Add("key1", "value1");
queryString.Add("key2", "value2");
return queryString.ToString(); // Returns "key1=value1&key2=value2", all URL-encoded
はHttpValueCollection
内部的なため、インスタンスを直接構築することはできません。ただし、インスタンスを取得したら、他の と同様に使用できますNameValueCollection
。操作している実際のオブジェクトは であるためHttpValueCollection
、ToString メソッドを呼び出すと のオーバーライドされた メソッドが呼び出されHttpValueCollection
、コレクションが URL エンコードされたクエリ文字列としてフォーマットされます。
同様の問題に対する答えを SO と Web で検索したところ、これが私が見つけた最も簡単な解決策でした。
.NET コア
.NET Core で作業している場合は、 クラスを使用できMicrosoft.AspNetCore.WebUtilities.QueryHelpers
、これにより作業が大幅に簡素化されます。
https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.webutilities.queryhelpers
サンプルコード:
const string url = "https://customer-information.azure-api.net/customers/search/taxnbr";
var param = new Dictionary<string, string>() { { "CIKey", "123456789" } };
var newUrl = new Uri(QueryHelpers.AddQueryString(url, param));