2013-01-25 48 views
3

今天發現了一些奇怪的東西,這可能有一個簡單的解釋。當URL引用一個子目錄時,NSURLRequest的奇怪行爲

如果我使用最初構建相對於是一個子目錄基本URL的NSURL創建的NSURLRequest,的NSURLRequest刪除子目錄。

這是很容易的代碼解釋:

// create a base URL to work with 
NSURL *baseUrl = [NSURL URLWithString:@"http://www.google.com/sub"]; 

// create a URL relative to the base URL 
NSURL *url1 = [NSURL URLWithString:@"/foo/bar" relativeToURL:baseUrl]; 

// create a NSURLRequest using this first URL 
NSURLRequest *mangled_req = [[NSURLRequest alloc] initWithURL:url1]; 
NSLog(@"url1: %@", url1); 
NSLog(@"mangled_req: %@", mangled_req); 

// now create another URL that puts the base URL together with the relative path 
NSURL *url2 = [NSURL URLWithString:@"http://www.google.com/sub/foo/bar"]; 

// and create a NSURLRequest, which should be the same as above 
NSURLRequest *correct_req = [[NSURLRequest alloc] initWithURL:url2]; 
NSLog(@"url2: %@", url2); 
NSLog(@"correct_req: %@", correct_req); 

輸出說明了這一點:

2013-01-25 11:55:37.386 url1: /foo/bar -- http://www.google.com/sub 
2013-01-25 11:55:37.408 mangled_req: <NSURLRequest http://www.google.com/foo/bar> 
2013-01-25 11:55:37.409 url2: http://www.google.com/sub/foo/bar 
2013-01-25 11:55:37.409 correct_req: <NSURLRequest http://www.google.com/sub/foo/bar> 

注意 「mangled_req」 遺漏/分。因爲我正在使用AFNetworking,並且希望在用於測試的本地主機(其自然具有我的Web應用程序在子目錄中)和遠程服務器(不)之間切換。

當然有解決方法,但是這似乎有些奇怪足夠,我認爲我必須做一些錯誤的。

回答

8

NSURL正確行爲和你對網址的工作是如何錯誤的假設。以斜線開頭的「相對」URL,如/foo/bar所示,始終表示相對於主機,而不是相對於現有路徑。所以,如果我添加/foo/bar作爲相對URL 任何網址scheme://host/path/1/2/3/whatever我總是會回來scheme://host/foo/bar。路徑上的前綴/表示路徑是絕對路徑。

當然,如果你解決這個問題,使得你的相對URL是foo/bar,你會發現你仍然有問題,因爲你原來的URL沒有結尾的斜線。就像如果我點擊指向somefile.html的鏈接訪問http://host.com/foo/index.html時,我最終會在http://host.com/foo/somefile.html而不是http://host.com/foo/index.html/somefile.html,NSURL將刪除最後一個路徑組件,如果它沒有結尾的斜槓。

+0

謝謝凱文,特別是說得很好(doh!) – mblackwell8