我正在编写单元测试以测试URL生成器类。
我正在使用NSURLComponents componentsWithString]
生成最终的URL对象。
是否有关于componentsWithString
如何转义正斜杠(/)的规则?
情况1:
NSURLComponents *urlComponents = [NSURLComponents componentsWithString: @"/foo"];
urlComponents.scheme = @"http";
urlComponents.host = [NSString stringWithFormat:@"www.bar.com"];
// [urlComponents URL] = http://www.bar.com/foo - Seems okay
情况2:
NSURLComponents *urlComponents = [NSURLComponents componentsWithString: @"////foo"];
urlComponents.scheme = @"http";
urlComponents.host = [NSString stringWithFormat:@"www.bar.com"];
// [urlComponents URL] = http://www.bar.com//foo
情况3:
NSURLComponents *urlComponents = [NSURLComponents componentsWithString: @"//////foo"];
urlComponents.scheme = @"http";
urlComponents.host = [NSString stringWithFormat:@"www.bar.com"];
// [urlComponents URL] = http://www.bar.com////foo
为什么情况2和3分别将斜杠的数量减少到2和4?
最佳答案
您的案例2和案例3不符合NSURLComponents文档中指定的RFC 3986路径格式:https://developer.apple.com/documentation/foundation/nsurlcomponents?language=objc
NSURLComponents类是一个类,旨在根据RFC 3986解析URL并从其组成部分构造URL。
从RFC 3986规范的路径部分:https://tools.ietf.org/html/rfc3986#section-3.3提到,除非存在授权组件,否则您的路径不能以//
开头:
如果是URI
不包含授权组件,则路径无法开始
带有两个斜杠字符(“ //”)。
如果将情况2和情况3调整为介于两者之间至少有一个字符,如下所示:
NSURLComponents *urlComponents = [NSURLComponents componentsWithString: @"/a/////foo"];
我相信它应该输出正确数量的斜杠。
关于ios - NSURLComponents componentsWithString-规则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54560732/