Ios NSURL使用冒号中断端口字符串

Ios NSURL使用冒号中断端口字符串,ios,escaping,nsurl,Ios,Escaping,Nsurl,我试图为我的网络代码添加一个基本url,问题是当传递到URLWithString:relativeToURL:方法时,该url会被破坏。此URL具有我正在使用的端口,但是,在调用所描述的后,URL错误,不包括我当前的端口号。我认为这是百分比逃避者的问题,但我尝试了一些方法来解决这个问题,但没有成功 这是我的密码: // absolute string returns a url a with broken path [[NSURL URLWithString:@"api/whatever" re

我试图为我的网络代码添加一个基本url,问题是当传递到
URLWithString:relativeToURL:
方法时,该url会被破坏。此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:
:“这些方法期望其字符串参数包含任何必要的转义码百分比。”

有人能解决这个问题吗


谢谢。

实际上解决方案非常简单。。。只需添加方案

大概是这样的:

NSURL *baseURL = [NSURL URLWithString:@"http://193.178.0.99:9000"];
NSString *absoluteString = [[NSURL URLWithString:@"api/whatever" relativeToURL:baseURL] absoluteString];

// Prints => http://193.178.0.99:9000/api/whatever

其实解决办法很简单。。。只需添加方案

大概是这样的:

NSURL *baseURL = [NSURL URLWithString:@"http://193.178.0.99:9000"];
NSString *absoluteString = [[NSURL URLWithString:@"api/whatever" relativeToURL:baseURL] absoluteString];

// Prints => http://193.178.0.99:9000/api/whatever

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

在您的示例中,由于您没有提供
http://
方案或类似方案,
193.178.0.99
被认为是该方案-就像它是
http
https
ftp
tel
mailto
-一样,
9000
端口被认为是URL的
主机
部分(但是根据RFC,由于
9000
可能不是有效的主机,这可能就是您附带警告的原因)

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


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

[[NSURL URLWithString:@"api/whatever"
        relativeToURL:[NSURL URLWithString:@"http://193.178.0.99:9000"]]
 absoluteString];                         // ^^^^^~~ this is the important part


注意:作为构建URL的替代解决方案,您可以使用iOS7的
NSURL组件
类分别操作
NSURL
部分,这是分解和构建URL的另一种方式

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

因此,在您的示例中,由于您没有提供
http://
方案或类似方案,
193.178.0.99
被视为方案-就像
http
https
ftp
tel
mailto
一样,
9000
端口被视为
主机
pURL的艺术性(但根据RFC,由于
9000
可能不是有效的主机,这可能就是为什么会出现警告)

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


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

[[NSURL URLWithString:@"api/whatever"
        relativeToURL:[NSURL URLWithString:@"http://193.178.0.99:9000"]]
 absoluteString];                         // ^^^^^~~ this is the important part


注意:作为构建URL的替代解决方案,您可以使用iOS7的
NSURL组件
类分别操作
NSURL
部分,这是分解和构建URL的另一种方式

非常感谢您的回答。非常感谢您的回答。仅供参考-“双点”字符(
)称为“冒号”.FYI-双点字符(
)称为“冒号”。