使用多键或逗号语法解析查询字符串数组

Zac*_*ach 6 .net c# query-string .net-core azure-functions

我有一个 .NET Core 6.0 Azure Function HTTP 触发器。

我希望以这两种常见形式处理数组查询字符串参数:

  • ?param=foo&param=escape%2Ctest
  • ?param=foo,escape%2Ctest

在这两种情况下我都想提取数组["foo", "escape,test"]

我惊讶地发现我可用的查询字符串解析选项要么不支持逗号语法,要么不支持将查询字符串作为参数分组的一部分进行 URL 解码。

我尝试过使用几种不同的 dotnet API:

这是.NET Fiddle 中的演示

var qs = "?param=foo,escape%2Ctest";

var a = httpRequest.Query["param"];
// ["foo,escape,test"]

var b = HttpUtility.ParseQueryString(qs)["param"];
// "foo,escape,test"

var c = QueryHelpers.ParseQuery(qs)["param"];
// ["foo,escape,test"]
Run Code Online (Sandbox Code Playgroud)

我有点惊讶的是不支持逗号分隔格式。我感到非常惊讶的是,似乎没有一种方法可以在不解码查询字符串参数的情况下获取分段查询字符串(这会阻止区分 和param=foo,escape%2Ctest?param=foo,escape,test

我将在下面将我当前的解决方案作为“答案”发布,但我希望我缺少一个使用 .NET 库的更简单的解决方案。如果有人能指出我在这里错过了什么,我将不胜感激。

Zac*_*ach 3

这是我当前的解决方案。再次,我希望有一种更少手动的方法来实现此行为。

public static IDictionary<string, List<string>> GroupByKey(this QueryString queryString)
{
  if (!queryString.Contains("?"))
  {
    throw new ArgumentException("Expected query string to contain '?' character.");
  }

  var encodedUrl = queryString.Value;
  var result = new Dictionary<string, List<string>>();
  string trimmedQueryString = encodedUrl.Split('?')[1];
  string[] queryStringSections = trimmedQueryString.Split('&');
  foreach (var section in queryStringSections)
  {
    var sides = section.Split('=');
    var key = sides[0];
    var value = sides[1];
    var values = value.Split(',');
    var decodedValues = values.Select(x => WebUtility.UrlDecode(x));

    if (!result.ContainsKey(key))
    {
      result.Add(key, new List<string>());
    }

    result[key].AddRange(decodedValues);
  }

  return result;
}
Run Code Online (Sandbox Code Playgroud)