我有一个像http://example.com/file?a=1&b=2&c=string%20param
这样的uri字符串是否存在将查询参数字符串转换为字典的现有函数,与ASP.NET Context.Request相同。
我正在编写一个控制台应用程序而不是Web服务,因此没有Context.Request来为我解析URL。
我知道自己破解查询字符串很容易,但我宁愿使用FCL函数,如果存在的话。
答案 0 :(得分:120)
您可以使用:
var queryString = url.Substring(url.IndexOf('?')).Split('#')[0]
System.Web.HttpUtility.ParseQueryString(queryString)
答案 1 :(得分:111)
使用此:
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));
答案 2 :(得分: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);
根据MSDN。不是您正在寻找的确切集合类型,但仍然有用。
修改:显然,如果您向ParseQueryString
提供完整的网址,则会添加“http://example.com/file?a”作为该集合的第一个关键字。由于这可能不是您想要的,我添加了子字符串以仅获取URL的相关部分。
答案 3 :(得分: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;
}
}
答案 4 :(得分: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"
答案 5 :(得分:7)
对于隔离项目,必须将依赖关系保持在最低限度,我发现自己使用了这个实现:
var arguments = uri.Query
.Substring(1) // Remove '?'
.Split('&')
.Select(q => q.Split('='))
.ToDictionary(q => q.FirstOrDefault(), q => q.Skip(1).FirstOrDefault());
但请注意,我不处理任何类型的编码字符串,因为我在受控环境中使用它,其中编码问题将是服务器端的编码错误,应该修复。
答案 6 :(得分:5)
在一行代码中:
string xyz = Uri.UnescapeDataString(HttpUtility.ParseQueryString(Request.QueryString.ToString()).Get("XYZ"));
答案 7 :(得分:0)
Microsoft Azure提供了一个框架,可以轻松执行此操作。 http://azure.github.io/azure-mobile-services/iOS/v2/Classes/MSTable.html#//api/name/readWithQueryString:completion:
答案 8 :(得分:-2)
您可以在控制台应用程序中引用System.Web,然后查找拆分URL参数的Utility函数。