为了账号安全,请及时绑定邮箱和手机立即绑定

在 AspNet Core 中解析空查询参数

在 AspNet Core 中解析空查询参数

C#
largeQ 2021-10-23 17:26:30
如何在 AspNet Core 中处理空查询参数?假设我们有一个查询 ?key1=foo1&key1=foo2&key2=&key3=null在解析它时,我希望在解析这个 URL 时有某种 Dictionary> 结果,例如:key1 : ["foo1", "foo2"] 这应该是同一个键下的多个值key2 : [""] 这应该是一个空字符串key3 : ["null"] 这应该是一个字符串,据我所知,URL 中的 null 只是一个文字我的问题是:我应该如何处理空查询参数?注意:我不能简单地定义查询参数并假设不存在的查询参数为空。但我认为如果需要,应该将 null 视为显式查询参数中的有效值。根据这个线程:How to send NULL in HTTP query string? 标准是传递编码的空值:见https://www.w3schools.com/tags/ref_urlencode.asp所以如果我想传递一个空值,我应该这样做: ?key1=foo1&key1=foo2&key2=&key3=%00问题是我不知道如何解码它以便将 %00 解析为空值。我尝试了以下方法:public Dictionary<string, List<string>> CreateFromQuery(string query){    if (query == null)    {        return new Dictionary<string, List<string>>();    }    var queryDictionary = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(query);    var result = queryDictionary.ToDictionary(kv => kv.Key, kv => kv.Value.ToList());    return result;}但是%00被转换成一个"\0"字符串,而不是一个null.做一个var decodedQuery= HttpUtility.UrlDecode(query);before 似乎也没有任何区别。UPDATE1:在 Kacper 和 Chris Pratt 发表评论(谢谢你们)之后,我现在采用了 Kacper 的第二个建议,因为我认为让请求者想要区分空查询参数、空查询参数和不存在的查询参数的场景很有趣。所以这是我目前的实现:public class QueryParserFactory    : IQueryParseable{    public Dictionary<string, List<string>> CreateFromQuery(string query)    {        if (query == null)        {            return new Dictionary<string, List<string>>();        }        var queryDecoded = HttpUtility.UrlDecode(query);        var queryDictionary = QueryHelpers.ParseQuery(queryDecoded);        var result = queryDictionary            .ToDictionary(                kv => kv.Key,                kv => kv.Value.Select(s => s == "\0" ? null : s).ToList());        return result;    }}
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 139 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信