我正在尝试为我的网络代码添加基本网址,问题是这个网址在传递给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:
上面的注释:“这些方法希望它们的字符串参数包含任何必要的转义码百分比。”
有没有人能解决这个问题?
感谢。
答案 0 :(得分:3)
实际上解决方案很简单......只需添加方案即可。
这样的事情:
list
答案 1 :(得分:3)
这种行为实际上是可以理解的(从RFC的角度来看):relativeToURL
部分应该是一个成熟的URL根,包括URL方案。
因此,在您的示例中,由于您没有提供http://
方案或类似方案,193.178.0.99
被视为方案 - 就像http
或{{1 }}或https
或ftp
或tel
- mailto
端口被视为您网址的9000
部分(但host
根据RFC,它可能不是一个有效的主机,这可能是你通过这种方式发出警告的原因)
在某种程度上,9000
的解释方式与电话号码网址193.178.0.99:9000
或邮件网址tel:1-541-754-3010
类似; mailto:john.doe@nowhere.com
将URL方案与主机分开,而不是将主机与端口分开。
要解决此问题,只需在:
参数中包含URL方案(如http
或https
或您打算使用的任何协议):
relativeToURL
注意:作为构建网址的替代解决方案,您可以使用iOS7的[[NSURL URLWithString:@"api/whatever"
relativeToURL:[NSURL URLWithString:@"http://193.178.0.99:9000"]]
absoluteString]; // ^^^^^~~ this is the important part
类分别操作NSURLComponents
部分,这是分解和构建网址的另一种方式