使用NSURLComponents拼接含IP的URL时斜杠被转义为%2F的问题咨询
转义现象产生的原因
- 该转义现象和
path字段的路径分隔符没有关联,问题根源是对NSURLComponents各属性的边界规则认知存在偏差 - 根据RFC 3986标准定义,URL结构中
host字段的合法作用域是scheme://之后、首个路径分隔符/之前的部分,host域内不允许出现路径分隔符/,如果给host赋值时混入了/,NSURLComponents会将这类字符判定为host域内的非法保留字符,自动转义为%2F - 结合示例代码,将
10.32.135.10/test.API整体赋值给host属性时,字符串中夹在10.32.135.10和test.API之间的/,会被当成host域的非法字符转义,最终才会出现10.32.135.10%2Ftest.API的输出;后续赋值的/api/path属于合法path字段内容,本身携带的斜杠并未被转义。
代码调整方案
- 按照URL组件的官方边界拆分内容,将原本误塞到host中的路径部分,挪入path属性统一管理,即可生成符合预期的URL,最终目标URL格式为
http://10.32.135.10/test.API/api/path?asetTypeId=1003 - 调整后的核心代码逻辑如下:
NSURLComponents *urlComponent = [[NSURLComponents alloc] init]; [urlComponent setScheme:@"http"]; // host仅填写纯IP/域名部分,移除原本混入的路径内容 [urlComponent setHost:@"10.32.135.10"]; // 将原host中携带的/test.API与自定义路径/api/path拼接为完整path [urlComponent setPath:@"/test.API/api/path"]; urlComponent.queryItems = qItems;
- 注意:如果业务场景确实需要在host域内传递带斜杠的特殊标识,需要提前对内容做符合规范的转义处理后再赋值,不能依赖NSURLComponents的默认host解析逻辑。
内容的提问来源于stack exchange,提问作者Aaban Tariq Murtaza
相关产品推荐
相关产品推荐

