在Querystring/Post/Get请求中检查重复键的最佳方法是什么?

本文关键字:最佳 是什么 方法 检查 Post Querystring Get 请求 | 更新日期: 2023-09-27 18:09:40

我正在编写一个小API,需要检查请求中的重复键。有人能推荐检查重复钥匙的最好方法吗?我知道我可以检查钥匙。值的逗号在字符串中,但我有另一个问题,不允许逗号在API请求。

    //Does not compile- just for illustration
    private void convertQueryStringToDictionary(HttpContext context)
    {
       queryDict = new Dictionary<string, string>();
        foreach (string key in context.Request.QueryString.Keys)
        {
            if (key.Count() > 0)  //Error here- How do I check for multiple values?
            {       
                context.Response.Write(string.Format("Uh-oh"));
            }
            queryDict.Add(key, context.Request.QueryString[key]);
        }       
    }

在Querystring/Post/Get请求中检查重复键的最佳方法是什么?

QueryString是一个NameValueCollection,这解释了为什么重复的键值显示为逗号分隔的列表(来自Add方法的文档):

如果指定的键已经存在于目标NameValueCollection中实例时,将指定的值添加到现有的以逗号分隔的值中"value1,value2,value3"形式的值列表。

因此,例如,给定这个查询字符串:q1=v1&q2=v2,v2&q3=v3&q1=v4,遍历键并检查值将显示:
Key: q1  Value:v1,v4 
Key: q2  Value:v2,v2 
Key: q3  Value:v3

由于您希望允许在查询字符串值中使用逗号,因此可以使用GetValues方法,该方法将返回一个字符串数组,其中包含查询字符串中键的值。

static void Main(string[] args)
{
    HttpRequest request = new HttpRequest("", "http://www.stackoverflow.com", "q1=v1&q2=v2,v2&q3=v3&q1=v4");
    var queryString = request.QueryString;
    foreach (string k in queryString.Keys)
    {
        Console.WriteLine(k);
        int times = queryString.GetValues(k).Length;
        if (times > 1)
        {
            Console.WriteLine("Key {0} appears {1} times.", k, times);
        }
    }
    Console.ReadLine();
}

向控制台输出以下内容:

q1
Key q1 appears 2 times.
q2
q3