2010-05-21 44 views
89

获得单独的查询参数我有一个URI字符串,如:http://example.com/file?a=1&b=2&c=string%20param从乌里

是否有将查询参数字符串转换成字典一样ASP.NET Context.Request做它的现有功能。

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

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

+0

可能重复[从.NET中的字符串获取URL参数](http://stackoverflow.com/questions/659887/get-url-parameters-from-a-string-in-net) – 2015-02-26 13:32:28

回答

76

使用此:

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

请注意'Uri .Query'只能在绝对的Uri上运行。在相对的一个上它会抛出一个'InvalidOperationExeception'。 – ghord 2013-06-23 11:46:58

112

您可以使用:

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

MSDN

+21

但是你需要添加一个对'System.Web.dll'的引用。 – SLaks 2010-05-21 18:28:17

+1

另一个答案说,ParseQueryString将添加'http://example.com/file?a'作为第一个键。 – Rune 2012-10-25 10:58:55

+1

用新代码更新。奇怪的是,这个答案似乎很受欢迎。 – Tejs 2012-11-06 21:47:29

-2

你可以在控制台应用程序中引用的System.Web,然后寻找一个分裂的URL参数的实用功能。

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。不是你正在寻找的确切的收集类型,但仍然有用。

编辑:很显然,如果你提供完整的URL来ParseQueryString它会添加“http://example.com/file?a”为集合的第一个关键。由于这可能不是你想要的,我添加了子字符串来获取url的相关部分。

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" 
+1

+1用于提供其他选项 – 2013-11-04 14:21:36

13

我不得不这样做为一个现代的Windows应用程序。我用下面的:

public static class UriExtensions 
{ 
    private static readonly Regex _regex = new Regex(@"[?|&]([\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; 
    } 
} 

编辑:这是更新按玛雅的建议

+1

正则表达式不会用“。”来捕获参数。在中间如:user.name – MaYaN 2014-10-01 23:58:18

+4

正则表达式应该是:“[?|&]([\ w \。] +)=([^?| ^&] +)” – MaYaN 2014-10-02 00:02:52

+0

工作!谢谢! – 2015-04-09 16:50:59

4

在单代码行:

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

对于孤立的项目,依赖项必须保持在最低限度,我发现自己使用这个实现心理状态:

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

由于不过请注意,我不处理任何类型的编码字符串,因为我是用这个在受控环境中,编码问题将是对应该固定在服务器端的编码错误。