我在文檔中找不到這個。NSURL是否應該解析無效的URL?
我在寫一些單元測試,其中一個應該失敗的測試是[NSURL URLWithString: @"cow"]
。因爲cow
不是有效的網址。
然而,它被愉快地解析了NSURL
沒有任何錯誤。它不返回nil
,它不會拋出異常。調用[url absoluteString]
就可以將它變回@"cow"
。
這是怎麼回事? NSURL
真的應該允許這個嗎?
我在文檔中找不到這個。NSURL是否應該解析無效的URL?
我在寫一些單元測試,其中一個應該失敗的測試是[NSURL URLWithString: @"cow"]
。因爲cow
不是有效的網址。
然而,它被愉快地解析了NSURL
沒有任何錯誤。它不返回nil
,它不會拋出異常。調用[url absoluteString]
就可以將它變回@"cow"
。
這是怎麼回事? NSURL
真的應該允許這個嗎?
NSURL允許包含「牛」的相對URL。
URI的RFC 2396中給出的一般形式允許相對引用:
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:'。 – 2010-08-11 21:36:53
該文檔說明URL根據RFC 1808進行分析 - 一個標題爲「相對統一資源定位符」的文檔,它允許相對或絕對URL。請參閱該RFC的第3頁,或相同定義的2396頁第14-16頁。相對URL是允許的。 – Chuck 2010-08-11 21:43:28
撤回我以前的評論,用下面的代替它:我忽略的一個明顯例子是在現有的超文本文檔中使用的href =「/ someotherdocument」。我想這是由開發人員來維護上下文,如果相對URL給出。 – 2010-08-12 00:17:14
從+ URLWithString的文檔:
字符串用來初始化 的NSURL對象。必須符合RFC 2396.此方法根據RFC 1738和1808解析URLString。 ... 如果字符串格式不正確,則返回nil。
對RFC 2396並不熟悉,我不能確定地說,但我認爲你必須至少有一個協議和主機(即使域本身轉發給主機)。我當然期望無。
如果您沒有通過@「cow」返回「無」,您應該在bugreporter.apple.com上提交一個錯誤。你可能想要標題爲「別有一頭牛」。
正確。基本規則在「3。 URI Syntactic Components「作爲'
正如我在對我的回答的評論中指出的那樣,Ahruman錯誤地認爲這是網址必須解析的強制性表單。相對URL是有效的並且是允許的。 – Chuck 2010-08-11 21:47:23
As @Chuck指出,@「牛」是一個有效的URL。像@「牛鈴」不應該,雖然... – walkytalky 2010-08-11 21:26:39