URL引用子目录时NSURLRequest的奇怪行为

时间:2013-01-25 01:09:04

标签: ios objective-c afnetworking

今天遇到了一些奇怪的事情,或许有一个简单的解释。

如果我使用最初相对于作为子目录的基本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”省略/ sub。

现在这让我很烦,因为我正在使用AFNetworking并希望在localhost之间切换以进行测试(当然我的web应用程序位于子目录中)和远程服务器(不是)。

当然有一些解决方法,但这对我来说似乎很奇怪,我必须做错事。

1 个答案:

答案 0 :(得分:8)

NSURL行为正确,您对URL工作方式的假设是错误的。以/foo/bar为斜杠开头的“相对”URL始终表示相对于主机,而不是相对于现有路径。因此,如果我将/foo/bar作为相对网址添加到任何网址scheme://host/path/1/2/3/whatever,我将始终返回scheme://host/foo/bar。路径上的前缀/表示路径是绝对的。

当然,如果您修复此问题,使得您的相对网址为foo/bar,则会发现您仍有问题,因为您的原始网址没有尾随斜杠。就像我在访问somefile.html时点击指向http://host.com/foo/index.html的链接一样,我最终在http://host.com/foo/somefile.html而不是http://host.com/foo/index.html/somefile.htmlNSURL将删除最后一条路径组件,如果它没有尾部斜杠。