【问题标题】:Is NSURL supposed to parse invalid URLs?NSURL 是否应该解析无效的 URL?
【发布时间】:2010-08-11 20:31:41
【问题描述】:

我在文档中找不到这个。

我正在编写一些单元测试,其中一个应该失败的测试是[NSURL URLWithString: @"cow"]。因为cow 不是有效的网址。

但是,NSURL 很高兴地解析了它,完全没有错误。它不会返回 nil 并且不会抛出异常。在其上调用[url absoluteString] 会将其变回@"cow"

这里发生了什么? NSURL 真的应该允许这样做吗?

【问题讨论】:

  • 正如@Chuck 指出的那样,@"cow" 是一个有效的 URL。不过,像 @"cow bell" 这样的东西不应该......

标签: iphone cocoa cocoa-touch ios


【解决方案1】:

NSURL 允许使用相对 URL,其中包括“cow”。

RFC 2396 中给出的一般形式的 URI 允许相对引用:

URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
relativeURI   = ( net_path | abs_path | rel_path ) [ "?" query ]
rel_path      = rel_segment [ abs_path ]
rel_segment   = 1*( unreserved | escaped |
                      ";" | "@" | "&" | "=" | "+" | "$" | "," )

除非我严重误读,否则这意味着任何有效字符序列都可以形成有效的相对 URL。

【讨论】:

  • 可以,但不能通过+URLWithString:
  • 文档说 URL 是根据 RFC 1808 解析的——一个标题为“相对统一资源定位器”的文档,它允许使用相对或绝对 URL。有关相同定义,请参见该 RFC 的第 3 页或 2396 的第 14-16 页。允许使用相对 URL。
  • 撤回我之前的评论,将其替换为: 我忽略的一个明显示例是在现有超文本文档中使用的 href="/someotherdocument"。我想如果给出了相对 URL,则由开发人员来维护上下文。
  • @Joshua Nozzi:是的,RFC 实际上同时说明了这一点以及您删除的评论中的内容——“必须强调的是,在文档的基本 URI 不太好的情况下,不能可靠地使用相对 URI -定义。”
【解决方案2】:

来自 +URLWithString 的文档:

用于初始化的字符串 NSURL 对象。必须符合 RFC 2396. 此方法根据 RFC 1738 和 1808 解析 URLString。 ... 如果字符串格式错误,则返回 nil。

我不是很熟悉 RFC 2396,我不能肯定地说,但我认为你必须至少有一个协议和一个主机(即使域本身转发到主机)。我当然希望为零。

如果您没有通过传递 @"cow" 得到“nil”,您应该在 bugreporter.apple.com 提交错误。您可能希望将其命名为“没有奶牛”。

【讨论】:

  • 正确。基本规则在“3. URI 语法组件”为<scheme>:<scheme-specific-part>。 “c:w” 会匹配,“cow” 不会。
  • 正如我在对我的回答的评论中指出的那样,Ahruman 错误地将其视为解析 URL 必须采用的强制形式。相对 URL 有效且允许。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多