背景(问题进一步)
我一直在来回搜索RFC和SO问题,以试图破解它,但我仍然没有得到杰克。
所以我想我们只是投票给“最佳”答案,仅此而已?
基本上可以归结为这一点。
3.4。查询组件
查询组件是由资源解释的信息字符串。
query = *uric
在查询组件中,保留字符“;”,“ /”,“?”,“:”,“ @”,“&”,“ =“,“ +”,“,”和“ $”。
让我感到困惑的第一件事是* uric定义如下
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
但是,这在某些段落中得到了澄清,例如
上面的“保留”语法类指的是URI中允许的那些字符,但是在通用URI语法的特定组件中可能不允许的那些字符;它们用作第3节中描述的组件的定界符。
并非在所有上下文中都保留“保留”集中的字符。在任何给定URI组件中实际保留的字符集由该组件定义。通常,如果将URI的语义更改为转义的US-ASCII编码,则保留该字符。
最后的摘录有些倒退,但是清楚地表明保留的字符集取决于上下文。但是3.4声明所有保留字符都保留在查询组件中,但是,唯一会改变此处语义的是转义问号(?),因为URI并未定义查询字符串的概念。
至此,我完全放弃了RFC,但发现RFC 1738特别有趣。
HTTP URL的形式为:
http://<host>:<port>/<path>?<searchpart>
在<path>和<searchpart>组件中,“ /”,“;”,“?” 保留。可以在HTTP中使用“ /”字符来指定层次结构。
我至少针对RFC 1738取代RFC 2396的HTTP URL对此进行解释。由于URI查询没有查询字符串的概念,因此对保留的解释也不允许我像以前那样定义查询字符串现在做。
题
当我想传递数字列表以及其他资源的请求时,一切就开始了。我没有考虑太多,只是将其作为逗号分隔的值传递。令我惊讶的是,尽管逗号已转义。查询page.html?q=1,2,3
编码变成page.html?q=1%2C2%2C3
可以使用,但是很丑陋,没想到。那是我开始阅读RFC的时候。
我的第一个问题很简单,是否真的需要编码逗号?
我的答案,根据RFC 2396:是的,根据RFC 1738:否
后来我找到了有关在请求之间传递列表的相关文章。csv方法被认为是不好的地方。而是出现了(以前没有见过)。
page.html?q=1;q=2;q=3
我的第二个问题,这是有效的网址吗?
我的答案,根据RFC 2396:否,根据RFC 1738:否(;保留)
只要有数字,我传递csv不会有任何问题,但是是的,如果确实突然需要使用逗号,那么您确实会冒着必须来回编码和解码值的风险。无论如何,我用ASP.NET尝试了分号查询字符串,结果却不是我所期望的。
Default.aspx?a=1;a=2&b=1&a=3
Request.QueryString["a"] = "1;a=2,3"
Request.QueryString["b"] = "1"
我看不到这与csv方法有很大的不同,因为当我要求输入“ a”时,会得到一个带逗号的字符串。ASP.NET当然不是参考实现,但还没有让我失望。
但最重要的是-我的第三个问题-规范在哪里?而您会做什么或为此不会做什么?