web-dev-qa-db-ja.com

Uriから個々のクエリパラメーターを取得する

次のようなuri文字列があります: http://example.com/file?a=1&b=2&c=string%20param

ASP.NET Context.Requestが行うのと同じ方法で、クエリパラメーター文字列を辞書に変換する既存の関数はありますか。

Webサービスではなくコンソールアプリを作成しているため、URLを解析するContext.Requestはありません。

クエリ文字列を自分で簡単に解読できることは知っていますが、存在する場合はFCL関数を使用します。

110
Ghostrider

これを使って:

string uri = ...;
string queryString = new System.Uri(uri).Query;
var queryDictionary = System.Web.HttpUtility.ParseQueryString(queryString);

Tejsによるこのコードは、URIからクエリ文字列を取得する「適切な」方法ではありません。

string.Join(string.Empty, uri.Split('?').Skip(1));
118
Timothy Shields

次を使用できます。

var queryString = url.Substring(url.IndexOf('?')).Split('#')[0]
System.Web.HttpUtility.ParseQueryString(queryString)

MSDN

120
Tejs

これは動作するはずです:

string url = "http://example.com/file?a=1&b=2&c=string%20param";
string querystring = url.Substring(url.IndexOf('?'));
System.Collections.Specialized.NameValueCollection parameters = 
   System.Web.HttpUtility.ParseQueryString(querystring);

MSDN による。探している正確なコレクションタイプではありませんが、それでも便利です。

編集:明らかに、ParseQueryStringに完全なURLを指定すると、 ' http://example.com/ file?a 'コレクションの最初のキーとして。それはおそらくあなたが望むものではないので、URLの関連部分のみを取得するためにサブストリングを追加しました。

25
pyrocumulus

最新のWindowsアプリの場合、これを行う必要がありました。私は次を使用しました:

public static class UriExtensions
{
    private static readonly Regex _regex = new Regex(@"[?&](\w[\w.]*)=([^?&]+)");

    public static IReadOnlyDictionary<string, string> ParseQueryString(this Uri uri)
    {
        var match = _regex.Match(uri.PathAndQuery);
        var paramaters = new Dictionary<string, string>();
        while (match.Success)
        {
            paramaters.Add(match.Groups[1].Value, match.Groups[2].Value);
            match = match.NextMatch();
        }
        return paramaters;
    }
}
14
Ross Dargan

HttpUtility.ParseQueryString() をご覧ください。辞書の代わりにNameValueCollectionを提供しますが、それでも必要なことを行う必要があります。

他のオプションは、string.Split()を使用することです。

    string url = @"http://example.com/file?a=1&b=2&c=string%20param";
    string[] parts = url.Split(new char[] {'?','&'});
    ///parts[0] now contains http://example.com/file
    ///parts[1] = "a=1"
    ///parts[2] = "b=2"
    ///parts[3] = "c=string%20param"
12
3Dave

依存関係を最小限に抑える必要がある孤立したプロジェクトの場合、私はこの実装を使用していることに気付きました:

var arguments = uri.Query
  .Substring(1) // Remove '?'
  .Split('&')
  .Select(q => q.Split('='))
  .ToDictionary(q => q.FirstOrDefault(), q => q.Skip(1).FirstOrDefault());

ただし、エンコードされた文字列はサーバー側でコーディングエラーが修正される必要がある制御された環境で使用しているため、エンコードされた文字列は処理しません。

8
Johny Skovdal

1行のコードで:

string xyz = Uri.UnescapeDataString(HttpUtility.ParseQueryString(Request.QueryString.ToString()).Get("XYZ"));
6
Pabinator

Microsoft Azureは、これを簡単に実行できるフレームワークを提供します。 http://Azure.github.io/Azure-mobile-services/iOS/v2/Classes/MSTable.html#//api/name/readWithQueryString:completion

0
Alex Bedro