我想使用-[NSURL parameterString]
来解析我传递过的网址的参数。它说URL必须符合RFC 1808,但现在想知道我们是否这样做了?!?我们使用类似的东西:
http://server/path/query?property1=value1&property2=value2
但RFC 1808从未提及&符号(& )作为有效的参数分隔符(至少我读它的方式)。它表示分号(; )。也许是因为它是在1995年起草的? & 取代了; 吗?如果有这样的话,任何人都要验证NSURL的parameterString是否也会用&作为分隔符?
在挖掘大洞之前,“正确”的方式是什么?
答案 0 :(得分:8)
根据RFC 1808(2.1.URL语法组件),正确的语法如下:
<scheme>://<net_loc>/<path>;<params>?<query>#<fragment>
它表示查询信息的格式符合RFC 1738的3.3节,它告诉我们:
“在路径和searchpart组件中,”/“,”;“,”?“是保留的。”
对我来说,上面说在你的URL中,路径(到你的CGI)是:
http://server/path/query
,查询是:
property1=value1&property2=value2
其中不包含任何保留字符。所以你没事。实际上使用“&amp;”作为查询字符串中的分隔符,此处派生自CGI specification而不是URL RFC:
“表单数据是由&amp;字符分隔的名称=值对的流。”
答案 1 :(得分:2)
RFC1808未定义查询字符串的内部格式。我相信1808所讨论的分号是另外一种不同类型的信息(在路径上),实际上从未使用过。 据我所知,NSURL接口不包含任何处理解析/拆分查询字符串本身内容的方法,因此这对类没有用处,实际上你的URL符合1808。
实际上,查询字符串本身并不具有任何RFC定义的格式;你可以很好地将任何字符串放入其中并在服务器端不受影响地检索它们。但是,HTML标准描述了一种从表单内容创建查询字符串的方法,大多数服务器端脚本都使用此application/x-www-form-urlencoded
格式。
根据HTML4第17.13.4.1节,&
是浏览器必须用于从多个参数创建查询字符串的参数分隔符,所以是的,您必须支持&符作为参数分隔符。 HTML4建议服务器端脚本接受分号作为查询字符串中&符号的替代分隔符,因为这样可以避免更多的转义。但它并不需要它,并且(不幸的是)许多服务器/表单阅读环境不会为此目的接受分号。