我正在编写单元测试以测试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/

10-09 08:05