NSURL用冒号破坏端口字符串

时间:2015-05-27 21:23:19

标签: ios escaping nsurl

我正在尝试为我的网络代码添加基本网址,问题是这个网址在传递给URLWithString:relativeToURL:方法时会被破坏。此URL具有我正在使用的端口,但是,在调用所述端口后,URL错误,不包括我当前的端口号。我认为这是百分比逃逸者的问题,但我已经尝试了一些方法来解决这个问题而没有成功。

这是我的代码:

// absolute string returns a url a with broken path
[[NSURL URLWithString:@"api/whatever" relativeToURL:[NSURL URLWithString:@"193.178.0.99:9000"]] absoluteString]
// printed absolute path 193.173.0.99:///api/whatever

其他尝试的方法:

NSString *baseURLString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef)@"193.178.0.99:9000",NULL,(CFStringRef)@":",kCFStringEncodingUTF8);
[[NSURL URLWithString:@"api/whatever" relativeToURL:[NSURL URLWithString:baseURLString]]
// Printed path : 193.173.0.99%3A8000/api/whatever, this path is still not working, although i have the percent escape set.

NSString *baseURLString = [@"193.173.0.99:8000" stringByAddingPercentEscapesUsingEncoding : NSUTF8StringEncoding];
// ... The same final code from above.
// Printed -> the very same first result.

编辑:从URLWithString:relativeToURL:上面的注释:“这些方法希望它们的字符串参数包含任何必要的转义码百分比。”

有没有人能解决这个问题?

感谢。

2 个答案:

答案 0 :(得分:3)

实际上解决方案很简单......只需添加方案即可。

这样的事情:

list

答案 1 :(得分:3)

这种行为实际上是可以理解的(从RFC的角度来看):relativeToURL部分应该是一个成熟的URL根,包括URL方案

因此,在您的示例中,由于您没有提供http://方案或类似方案,193.178.0.99被视为方案 - 就像http或{{1 }}或httpsftptel - mailto端口被视为您网址的9000部分(但host根据RFC,它可能不是一个有效的主机,这可能是你通过这种方式发出警告的原因)

在某种程度上,9000的解释方式与电话号码网址193.178.0.99:9000或邮件网址tel:1-541-754-3010类似; mailto:john.doe@nowhere.com将URL方案与主机分开,而不是将主机与端口分开。

要解决此问题,只需在:参数中包含URL方案(如httphttps或您打算使用的任何协议):

relativeToURL

注意:作为构建网址的替代解决方案,您可以使用iOS7的[[NSURL URLWithString:@"api/whatever" relativeToURL:[NSURL URLWithString:@"http://193.178.0.99:9000"]] absoluteString]; // ^^^^^~~ this is the important part 类分别操作NSURLComponents部分,这是分解和构建网址的另一种方式