美文网首页iOS相关
iOS:URI的规范的百分比编码和解码

iOS:URI的规范的百分比编码和解码

作者: 上发条的树 | 来源:发表于2018-01-02 10:41 被阅读73次

    参考

    关于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就是params

    • query
      通过get方式请求的参数部分。例如:http://www.xxx.com/index.html?username=wxx&password=123,其中username=wxx&password=123就是query

    • fragment
      当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

    相关文章

      网友评论

        本文标题:iOS:URI的规范的百分比编码和解码

        本文链接:https://www.haomeiwen.com/subject/sfwmgxtx.html