我正在寻找将HTTP GET请求的查询字符串转换为字典形式,以及将其转回查询字符串的最简单方法。
我认为一旦查询转换成字典形式,就可以更容易地进行各种操作,但我似乎需要很多代码才能完成转换。有没有推荐的方式?
我正在寻找将HTTP GET请求的查询字符串转换为字典形式,以及将其转回查询字符串的最简单方法。
我认为一旦查询转换成字典形式,就可以更容易地进行各种操作,但我似乎需要很多代码才能完成转换。有没有推荐的方式?
HttpUtility.ParseQueryString()
将查询字符串解析为NameValueCollection
对象,将后者转换为IDictionary<string, string>
只需要简单的foreach
。然而,这可能是不必要的,因为NameValueCollection
具有一个索引器,所以它的行为很像字典。
这是我通常的做法
Dictionary<string, string> parameters = HttpContext.Current.Request.QueryString.Keys.Cast<string>()
.ToDictionary(k => k, v => HttpContext.Current.Request.QueryString[v]);
和Sean一样,但使用Linq(并且有一个您可以复制并粘贴的函数):
public static Dictionary<string, string> ParseQueryString(string queryString)
{
var nvc = HttpUtility.ParseQueryString(queryString);
return nvc.AllKeys.ToDictionary(k => k, k => nvc[k]);
}
另外,问题是如何将它转换回查询字符串:
public static string CreateQueryString(Dictionary<string, string> parameters)
{
return string.Join("&", parameters.Select(kvp =>
string.Format("{0}={1}", kvp.Key, HttpUtility.UrlEncode(kvp.Value))));
}
刚刚不得不为了一个兼容Mono的解决方案而这样做
Regex.Matches(queryString, "([^?=&]+)(=([^&]*))?").Cast<Match>().ToDictionary(x => x.Groups[1].Value, x => x.Groups[3].Value)
HttpUtility.ParseQueryString
在那里也不存在)。 - JWLvar query = HttpContext.Request.QueryString.Value;
var queryDictionary = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(query);
HttpUtility.ParseQueryString()
实用程序的受限环境: public static Dictionary<string, string> ParseQueryString(String query)
{
Dictionary<String, String> queryDict = new Dictionary<string, string>();
foreach (String token in query.TrimStart(new char[] { '?' }).Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries))
{
string[] parts = token.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length == 2)
queryDict[parts[0].Trim()] = HttpUtility.UrlDecode(parts[1]).Trim();
else
queryDict[parts[0].Trim()] = "";
}
return queryDict;
}
public static Dictionary<string, string> ParseQueryString2(String query)
{
return Regex.Matches(query, "([^?=&]+)(=([^&]*))?").Cast<Match>().ToDictionary(x => x.Groups[1].Value, x => HttpUtility.UrlDecode( x.Groups[3].Value ));
}
var dictionary = query.Replace("?", "").Split('&').ToDictionary(x => x.Split('=')[0], x => x.Split('=')[1]);
.ToDictionary
前添加 .Where(x => !String.IsNullOrEmpty(x))
来避免异常。 - vicentedealencar:
NameValueCollection nvcData = HttpUtility.ParseQueryString(queryString);
Dictionary<string, string> dictData = new Dictionary<string, string>(nvcData.Count);
foreach (string key in nvcData.AllKeys)
{
dictData.Add(key, nvcData.Get(key));
}
最简单的:
Dictionary<string, string> parameters = new Dictionary<string, string>();
for (int i = 0; i < context.Request.QueryString.Count; i++)
{
parameters.Add(context.Request.QueryString.GetKey(i), context.Request.QueryString[i]);
}
var parameters = Request.QueryString.Keys.Cast<string>().ToDictionary(k => k, v => Request.QueryString[v]);
。 - johnny 5NameValueCollection
值会被静默修改。例如,尝试调用var q = HttpUtility.ParseQueryString("firstParam=cGFzc35+d29yZA==")
(这是字符串pass~~word
的 base64 编码),然后使用for (var i = 0; i <= q.Keys.Count; ++i) { var val = q[q.Keys[i]]; }
进行迭代。观察val
的值:你将得到cGFzc35 d29yZA==
而不是cGFzc35+d29yZA==
。 - OfirD