参考
关于URI编码
在URI的规范中定义了一些保留字符,如":","/","?","&","=","@","%"等字符,在URI中都有他的作用。如果要在请求参数上表达URI的这写保留字符,必须在%字符后以十六进制的数值表示,来表示该字符的八个字符数值。
例如:":"字符用十六进制来表示为3A,所以必须使用%3A来表示,"/"字符用十六进制来表示为2F,所以必须使用%2F来表示"/"字符。
iOS中的方式
在iOS中可以用stringByAddingPercentEncodingWithAllowedCharacters
对URI进行编码,使用stringByRemovingPercentEncoding
进行解码:
stringByAddingPercentEncodingWithAllowedCharacters:
stringByRemovingPercentEncoding
例如:
NSString *urlStr = @"https://www.baidu.com";
urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLUserAllowedCharacterSet]];
NSLog(@"百分比编码:%@",urlStr);
urlStr = [urlStr stringByRemovingPercentEncoding];
NSLog(@"解码:%@",urlStr);
打印结果:
百分比编码:https%3A%2F%2Fwww.baidu.com
解码:https://www.baidu.com
从方法定义,可以看到,传入参数是一个NSCharacterSet
对象
- (NSString *)stringByAddingPercentEncodingWithAllowedCharacters:(NSCharacterSet *)allowedCharacters;
具体的参数在NSCharacterSet
的分类中NSURLUtilities
以属性的格式对外暴露,我们只能readonly
:
- URLUserAllowedCharacterSet
- URLPasswordAllowedCharacterSet
- URLHostAllowedCharacterSet
- URLPathAllowedCharacterSet
- URLQueryAllowedCharacterSet
- URLFragmentAllowedCharacterSet
这么多选择,第一个URLUserAllowedCharacterSet
对应整一条的URL
。其他的对应URL
的各个部分。
URL的组成
URL
提供了一种访问定位因特网上任意资源的手段,这些资源可以通过不同的方式(HTTP/FTP/SMTP)来访问。无论是那种方式,基本上有9个部分组成:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<fragment>
scheme
获取资源的协议,例如HTTP、FTP等。user:password
用户名和密码,一般范围FTP资源才需要。host
主机名,访问的那台主机,有时候可以是IP,有时候可以是主机名。port
端口号,如果HTTP的访问默认是80,可以省略。path
上面通过host:post找得到我们的主机,而主机中文件很多,因此需要通过path定位具体文件的位置。params
这个很少见,主要作用就是像服务器提供额外的参数,用来表示本次请求的一些特性。例如ftp传输模式有两种,二进制和文本,你肯定不希望使用文本形式传输二进制图片,这样你的图片下载下来后可能没法看了。为了向应用程序提供更丰富的信息,URL中有个专门的部分来表示这种参数。例如ftp://file.xxx.com/pub/guid.pdf;type=d其中的type=d就是paramsquery
通过get方式请求的参数部分。例如:http://www.xxx.com/index.html?username=wxx&password=123,其中username=wxx&password=123就是queryfragment
当html页面比较长时,我们通常会将其分为好几段,可以快速定位到某一段。例如http://www.xxx.com/index.html#1,#1可以快速定位到其中一段。
例如:
NSString *urlStr = @"https://www.xxx.com:8888/file/index.html?username=wxx&password=123#1";
NSURL *url = [NSURL URLWithString:urlStr];
NSLog(@"%@",url.scheme);
NSLog(@"%@",url.host);
NSLog(@"%@",url.port);
NSLog(@"%@",url.path);
NSLog(@"%@",url.query);
NSLog(@"%@",url.fragment);
打印结果:
https
www.xxx.com
8888
/file/index.html
username=wxx&password=123
1