URL的组成部分

URL的组成部分

URL(统一资源定位符)是URI(通用资源标识)的特定类型,URL通常在因特网上查找现有资源。当Web客户机向服务器发出对资源的请求时,使用URL。
URI 和 URL 的概念由因特网协会和 IETF(因特网工程任务组织)请求评论文档 RFC 2396 统一资源标识(URI):一般语法定义(http://www.ietf.org/rfc/rfc2396.txt)。简要地说,***URI 是定义为识别资源的任何一个字符串*。URL 定义为按资源的位置或用户访问它的方式,而不是按资源的名称或其他属性来识别资源的那些 URI。**

HTTP(HTTPS)的 URL 通常由三或四个组成部分组成:

  • 规则
    • 规则识别用于访问因特网上的资源协议
  • 主机
    • 主机名识别拥有资源的主机
  • 路径
    • 路径识别主机中Web客户机要访问的特定资源
  • 查询字符
    • 如果使用查询字符串,那么它跟随路径部分,并且提供一串字符串,资源使用这些字符串可以完成某些操作(例如,作为用于搜索的参数或用于处理的数据)。 查询字符串通常是一串名称和值对,例如,q=bluebird。

URL 的规则和主机部分不定义为区分大小写,但是路径和查询字符串是区分大小写的。通常,整个 URL 指定为小写字母。
URL 的组成部分如下所示进行组合和定界:

scheme://host:port/path?query
  • 规则后跟冒号和两个正斜杠。
  • 如果指定端口号,那么主机名后面是号码,并用冒号分隔。
  • 路径名以单正斜杠开始。
  • 如果指定查询字符串,那么在它的前面加个问号。

图 1. HTTP URL 语法
阅读语法图跳过直观语法图
.-:80—–.

-http://--+-host name–+–+———+–/–path component——>
‘-IP address-‘ ‘-:–port-‘

–+—————–+—————————————–><
‘-?–query string-‘

URL 的后面可以跟片段标识。URL 与片段标识之间使用的分隔符是字符 #。片段标识用于使 Web 浏览器指向它刚检索的项中的引用或函数。 例如,如果 URL 标识 HTML 页面,那么可使用片段标识,以子节的标识来指示页面中的子节。对于这种情况,Web 浏览器通常向用户显示页面, 以使用户可以看到子节。根据项的介质类型以及为该介质类型的片段标识所定义含义的不同,Web 浏览器为片段标识所采取的操作也会不同

https://item.jd.com/11818781778.html#crumb-wrap

OC中如何获取URL的中各个组成部分

为获取URL中的各个组成部分,Foundation框架为我们提供了一个NSURLComponents类,通过该类,可以获取到URL中和各个组成部分

    // NSURLComponents 相关字段
    @property (nullable, copy) NSString *scheme; // 规则, Attempting to set the scheme with an invalid scheme string will cause an exception.
    @property (nullable, copy) NSString *user;//用户
    @property (nullable, copy) NSString *password;//密码
    @property (nullable, copy) NSString *host;//主机
    @property (nullable, copy) NSNumber *port; // 端口 Attempting to set a negative port number will cause an exception.
    @property (nullable, copy) NSString *path;//路径
    @property (nullable, copy) NSString *query;//查询字符
    @property (nullable, copy) NSString *fragment;//片段标识
    @property (nullable, copy) NSArray<NSURLQueryItem *> *queryItems; //查询字段数组

示例

    NSString * urlString = @"http://54.223.156.84:9120/relayserver/spring/commands/command?commandType=cmd_type_ad&commandName=&commandStatus=&code=10001&id=test_snapshow_ios_first_test&page=&restrict=false";
    urlString = @"https://item.jd.com/11818781778.html#crumb-wrap";
    // 创建组件对象
    NSURLComponents *components = [NSURLComponents componentsWithString:urlString];

    //规则
    NSString * scheme = components.scheme;
    // 路径
    NSString * path = components.path;
    //端口
    NSString * port = components.port;
    //查询字符串
    NSString * query  = components.query;
    //片段标识
    NSString * fragment = components.fragment;
    //获取查询参数
    NSMutableDictionary *paramsDic = [NSMutableDictionary dictionary];
    for (NSURLQueryItem *item in components.queryItems) {
        [paramsDic setValue:item.value forKey:item.name];
    }

添加查询字段

NS_ASSUME_NONNULL_BEGIN

@interface NSURLComponents (addQueryItem)
-(void)addQueryItem:(NSURLQueryItem*)queryItem;
@end

NS_ASSUME_NONNULL_END

@implementation NSURLComponents (addQueryItem)
-(void)addQueryItem:(NSURLQueryItem *)queryItem{
    NSMutableArray * queryitems = [NSMutableArray arrayWithArray:self.queryItems];
    [queryitems addObject:queryItem];
    self.queryItems = queryitems;
}
@end


   转载规则


《URL的组成部分》 志鹏 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
GCD GCD
GCDGCD(Grand Central Dispatch)是一个能让开发者轻松写出并发代码的强大特性。它把管理多个线程及线程同步的重担转移给了操作系统。使用GCD时,只需要创建能够彼此独立执行的单元,而让操作系统为你处理队列和同步。iOS
2018-01-27 志鹏
下一篇 
runtime - 实现对象的自动拷贝 runtime - 实现对象的自动拷贝
在我们开发过程中,有时会遇到对象进行拷贝的情况,在对象属性少的情况下,我们可以直接在 copyWithZone:/mutableCopyWithZone: 方法里手动对复制后的对象的相应属性赋值,但在属性成员很多的情况及通过runtime在
2018-01-06 志鹏
  目录