从Uri获取单个查询参数

Gho*_*der 112 .net c# uri

我有一个uri字符串,如:http://example.com/file? a = 1&b = 2&c = string%20param

是否存在将查询参数字符串转换为字典的函数,与ASP.NET Context.Request相同.

我正在编写一个控制台应用程序而不是Web服务,因此没有Context.Request来为我解析URL.

我知道自己破解查询字符串很容易,但我宁愿使用FCL函数,如果存在的话.

Tim*_*lds 122

用这个:

string uri = ...;
string queryString = new System.Uri(uri).Query;
var queryDictionary = System.Web.HttpUtility.ParseQueryString(queryString);
Run Code Online (Sandbox Code Playgroud)

Tejs的这段代码不是从URI获取查询字符串的"正确"方法:

string.Join(string.Empty, uri.Split('?').Skip(1));
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`Uri.Query`仅适用于绝对Uri.在相对的一个上它会抛出一个`InvalidOperationExeception`. (15认同)

Tej*_*ejs 119

您可以使用:

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

MSDN

  • 但是你需要添加对`System.Web.dll`的引用. (26认同)

pyr*_*lus 25

这应该工作:

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);
Run Code Online (Sandbox Code Playgroud)

根据MSDN.不是您正在寻找的确切集合类型,但仍然有用.

编辑:显然,如果您提供完整的网址,ParseQueryString则会添加" http://example.com/file?a "作为该集合的第一个关键字.由于这可能不是你想要的,我添加了子字符串以仅获取url的相关部分.


Ros*_*gan 14

我必须为现代的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;
    }
}
Run Code Online (Sandbox Code Playgroud)


3Da*_*ave 12

看看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"
Run Code Online (Sandbox Code Playgroud)


Joh*_*dal 9

对于必须将依赖关系保持在最低限度的独立项目,我发现自己使用了这个实现:

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

但请注意,我不处理任何类型的编码字符串,因为我在受控环境中使用它,其中编码问题将是服务器端应该修复的编码错误.


Pab*_*tor 7

在一行代码中:

string xyz = Uri.UnescapeDataString(HttpUtility.ParseQueryString(Request.QueryString.ToString()).Get("XYZ"));
Run Code Online (Sandbox Code Playgroud)