从 Uri 获取单独的查询参数

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

现有的函数是否可以像 ASP.NET Context 一样将查询参数字符串转换为字典。要求就是要求。

我正在编写一个控制台应用程序,而不是一个网络服务,所以没有上下文。请求为我解析 URL。

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

148504 次浏览

你可使用:

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

MSDN

你可以参考系统。然后查找分割 URL 参数的实用控制台应用函数。

这应该会奏效:

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 的相关部分。

看一下 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"

用这个:

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));

我不得不为一个现代的 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;
}
}

在一行代码中:

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

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

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

但是,请注意,我确实使用 没有处理任何类型的编码字符串,因为我是在受控设置中使用它的,其中编码问题将是服务器端的编码错误,应该予以修复。