6

我想-[NSURL parameterString]用来解析我传递的 URL 的参数。它说 URL 必须符合RFC 1808但现在想知道我们的是否符合?!?我们使用类似的东西:

http://server/path/query?property1=value1&property2=value2

但 RFC 1808 从未提及与号(&)作为有效的参数分隔符(至少我阅读它的方式)。它建议使用分号 ( ; )。也许是因为它是在 1995 年起草的?有&取代了; ? 如果是这样,有人验证 NSURL 的 parameterString 是否也会用 & 作为分隔符进行解析?

在我们挖一个大洞之前,“正确”的方法是什么?

4

2 回答 2

8

根据 RFC 1808 (2.1. URL Syntactic Components),正确的语法如下:

<scheme>://<net_loc>/<path>;<params>?<query>#<fragment>

它说查询信息按照 RFC 1738 的第 3.3 节进行格式化,这告诉我们:

"在 path 和 searchpart 组件中,"/"、";"、"?" 被保留。"

对我来说,上面说在您的 URL 中,路径(到您的 CGI)是:

http://server/path/query

查询是:

property1=value1&property2=value2 

其中不包含任何保留字符。所以你没事。事实上,这里在查询字符串中使用“&”作为分隔符源自CGI 规范,而不是 URL RFC:

“表单数据是由 & 字符分隔的名称=值对流。”

于 2010-01-23T00:07:15.307 回答
2

RFC1808 没有定义查询字符串的内部格式。我相信 1808 所谈论的分号内容是不同类型的附加信息(在路径上),实际上从未使用过。据我所知,NSURL 接口不包含任何处理解析/拆分查询字符串本身内容的方法,因此该类不感兴趣,而且您的 URL 确实符合 1808 标准。

实际上查询字符串本身并不具有任何 RFC 定义的格式;您可以很好地将任何字符串放入其中,并在服务器端原封不动地检索它们。然而,HTML 标准描述了一种从表单内容创建查询字符串的方法,并且application/x-www-form-urlencoded大多数服务器端脚本都使用这种格式。

根据 HTML4 第 17.13.4.1 节,&浏览器必须使用参数分隔符从多个参数创建查询字符串,所以是的,您必须支持与号作为参数分隔符。HTML4 建议服务器端脚本应该接受分号作为查询字符串中与符号的替代分隔符,因为这样可以避免更多的转义。但它不需要它,而且确实(不幸的是)许多服务器/表单阅读环境不接受分号用于此目的。

于 2010-01-22T22:29:18.347 回答