我一直在谷歌这来回阅读 RFC 和所以问题试图解决这个问题,但我仍然没有得到任何东西。
So I guess we just vote for the "best" answer and that's it, or?
基本上就是这样。
3.4. 查询组件
查询组件是要由资源解释的信息字符串。
query = *uric
在查询组件中,保留字符“ ;”、“/”、“ ?”、“ :”、“@”、“ &”、“ =”、“ +”、“”和“ $”。
让我困惑的第一件事是尿液是这样定义的
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
This is however somewhat clarified by paragraphs such as
上面的“保留”语法类指的是 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
我的第二个问题,这是一个有效的 URL 吗?
我的回答,根据 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”时,我得到的是一个带有逗号的字符串。NET 当然不是一个参考实现,但它还没有让我失望。
但最重要的是——我的第三个问题——这方面的规范在哪里?你会做什么或者不做什么?