NSURLComponents componentsWithString-规则

时间:2019-02-06 18:57:43

标签: ios objective-c nsurl

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

1 个答案:

答案 0 :(得分:0)

您的情况2和3不符合NSURLComponents文档https://developer.apple.com/documentation/foundation/nsurlcomponents?language=objc

中指定的RFC 3986路径格式。
  

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"];

我相信它应该输出正确数量的斜杠。