本文参考:IOS网络编请求响应之URL结构
本文不仅针对URL结构进行了分析,而且对于对于url的一些编码的注意事项也给出了解决方法;
在url规范中:":/?#[]@!¥&’()*+,;="等符号都是有特殊含义的,如果我们在进行get请求时,请求的参数中包含了这些特殊字符就会引起冲突,解决方法就是讲这些特殊的字符转换为“%+ASCII”形式,iOS中的CFURLCreateStringByAddingPercentEscapes函数就可以处理这个问题
参考连接:URL 编码:CFURLCreateStringByAddingPercentEscapes
扩展连接:
对于iOS网络请求相关的了解可以参考下面相关连接:
IOS项目开发之网络编程 - 随笔分类 - 人魔七七 - 博客园
######2017年12月更
对于url的encode,iOS提供了两个API:
API1:-(nullableNSString*)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encde(iOS9已废弃)
API2:-(nullableNSString*)stringByAddingPercentEncodingWithAllowedCharacters:(NSCharacterSet*)allowedCharacters
API1中会对url中除了保留字外的其他字符都进行%+ASICC编码,比如
https://www.xingshulin@xixing.com#mark?p1=hello world&p2=我是参数2&p3=query3
上面用API1编码后输出:https://www.xingshulin@xixing.com%23mark?p1=hello%20world&p2=%E6%88%91%E6%98%AF%E5%8F%82%E6%95%B02&p3=query3
用API2,如果使用URLQueryAllowedCharacterSet进行编码是一样的,但如果使用URLHostAllowedCharacterSet编码会输出:
https%3A%2F%2Fwww.xingshulin%40xixing.com%23mark%3Fp1=hello%20world&p2=%E6%88%91%E6%98%AF%E5%8F%82%E6%95%B02&p3=query3
可见,API2比API1的功能更强大。API2针对除了www.xingshulin之外的其他特俗字符都进行了编码。
如果有时候我们不需要对某些特殊字符进行编码,比如上面的#mark,mark前的“#”,那么用API2也可以实现,通过customAllowedSet = NSCharacterSet(charactersInString:"`%^{}\"[]|\\<> ").invertedSet,自定义characterSet可以实现。上面就保证了,会保留"`%^{}\"[]|\\<> "之外的特俗字符“#”,输出如下:www.xingshulin@xixing.com#mark?p1=hello%20world&p2=%E6%88%91%E6%98%AF%E5%8F%82%E6%95%B02&p3=query3