Ios NSURL使用冒号中断端口字符串
我试图为我的网络代码添加一个基本url,问题是当传递到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
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
以类似的方式解释为电话号码URLtel:1-541-754-3010
或邮件URLmailto: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
以类似的方式解释为电话号码URLtel:1-541-754-3010
或邮件URLmailto: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-双点字符(:
)称为“冒号”。