【读】这一次,让我们再深入一点 - URL你是否真的了解?

这是关于网络系列的第五篇文章,接下来会有更多精彩内容.敬请期待! 让我们一起乘风破浪!

前言

在浩瀚的互联网中,URL就是互联网资源的标准化名称。本节,让我们一起扒开URL的外衣!你可以了解到一下内容:

  • URL语法,以及各种URL组件的含义以及其所做的工作
  • URL和自动扩展URL
  • URL编码和字符规则

URL的用途

之前说URL是统一资源定位符,视乎它只是用来标识资源的位置似得。其实,不止如此!URL为用户及他们的浏览器提供的找到信息所需的所有条件,包括它位于何处,以及如何获取它或者说如何处理它

URL语法

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

下面是Cornerstone的一个目录的配置:

可以看到红色框中的URL包含了 user信息,密码为了安全并没有显示出来.

上面是一个URL的通用格式,当然几乎没有哪个URL包含了所有这些组件。最重要的3部分是:scheme,host,path.下面是各部分的说明:

组件描述默认值
scheme访问服务器获取资源时使用的协议
user访问资源时使用的用户名无(匿名)
password用户的密码,和用户名使用:分割E-mail
host资源服务器主机名或IP地址
port资源服务器监听的端口,不同的scheme有不同的默认端口(HTTP使用80作为默认端口)和scheme有关
path服务器上的资源路径。路径与服务器和scheme有关默认值
params在某些scheme下指定输入参数,是键值对。可以有多个,使用;分割默认值
query该组件没有通用的格式,HTTP中大多使用&来分隔多个query。使用?分隔query和其他部分
frag(或fragment)一小片或一部分资源名称。引用对象时,不会将fragment传送给服务器,客户端内部使用。通过#分隔fragment和其余部分

印象中,一个带有参数的URL,会把参数拼接到URL后面,使用?和前面的隔开,现在看来,拼接的是query啊!看看下面代码片段的输出:

NSURL *aUrl = [NSURL URLWithString:@"https://www.baidu.com:80/library/image/girl.gif;face=beautiful;size=normal?lang=zh&os=windows#url-section"];
// 为了输出好看,加入了分隔字符
NSLog(@"\n---------------------------------------\n*\tscheme = %@\n*\tuser = %@\n*\tpassword = %@\n*\thost = %@\n*\tport = %@\n*\tpath = %@\n*\tparams = %@\n*\tquery = %@\n*\tfrag = %@\n---------------------------------------", aUrl.scheme, aUrl.user, aUrl.password, aUrl.host, aUrl.port, aUrl.path, aUrl.parameterString, aUrl.query, aUrl.fragment);
复制代码

看到上述结果,若你之前的认识有误,请更正!

Tips
  • scheme部分是大小写无关的
  • HTTP的下层是TCP,默认端口80
  • 路径是可以由多部分组成的,每一部分可以拥有自己的参数。如/hammers;sale=false/index.html;graphics=true
  • 也许我们在实际运用中用query组件来充当了params组件;但注意,实际?后面的是query组件。
  • 对应fragment组件来说,服务器通常指处理整个对象,在请求时服务器不会接受到该组件,它只是客户端使用的

URL快捷方式

  • 相对URL
    URL有两种方式:绝对的相对的。之前的示例都是绝对的,就是从头到尾写全的;而相对的,是需要一个参照URL,被称为基础(NSURL类中有该属性baseURL),相对URL在HTML开发中比较常见。
  • 自动扩展URL
    浏览器自动扩展scheme、主机名、或根据历史记录扩展。用户无需输入完整的URL。

令人头疼的字符

URL作为互联网资源的标识,必须是可移植的、完整的。意思就是说,一个URL确定后,不管如何复制粘贴,这个URL的信息不能丢失!但是,URL使用的编码是ASCII,中文是不支持的(当然,不止是中文这么简单,ASCII无法表示所有字符这才是硬伤)。为了使用ASCII,又要支持其他字符,所以,编码就来了。其实这种编码就是转义,使用A代表B(比如URL中包含的类似%7E符号,就是转义之后的,代表着~这个特殊符号)。另外,还有一些特殊的保留字符(就像C语言中的关键字一样),若在保留场合之外使用需要编码。下面列举了这些字符:

特殊字符说明
%作为转义标志
...路径组件,分别表示当前目录,和上级目录
#?;:分别是fragment分割符,query分隔符,参数分隔符,scheme等分隔符
$+保留
@&=在不同scheme中有特殊含义
{}\|\^[]使用受限
<>"不安全
0x00-0x1F>=0x7F无法打印,超出ASCII字符集的7位二进制范围

下面看一段代码:

    NSString *scheme = @"HTTP";
    NSString *user = @"gaoy";
    NSString *password = @"123456";
    NSString *host = @"www.goyaya.米西米西";
    NSString *port = @"80";
    NSString *path = @"/image/gif/a.gif";
    NSString *params = @"face=beautiful;seze=normal";
    NSString *query = @"language=zh&os=macOS";
    NSString *frag = @"url-section";
    // 若host不进行编码,生成的URL将为空
    NSString *urlString = [NSString stringWithFormat:@"%@://%@:%@@%@:%@%@;%@?%@#%@",
                           scheme, user, password,
                           [host stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]],
                           port, path, params, query, frag];
    NSLog(@"%@", urlString);
    NSURL *url = [NSURL URLWithString:urlString];
    NSLog(@"%@\n\n\n", url.absoluteString);
    // 解码
    NSLog(@"%@", url.absoluteString.stringByRemovingPercentEncoding);
复制代码

从代码可以看出, OC的库中, 给出了URL每个组成部分的允许字符集(在NSCharacterSetNSURLUtilities扩展中, Swift可以使用string.addingPercentEncoding(withAllowedCharacters:)方法进行特定部分的编码,使用string.removingPercentEncoding解码)

详细的讨论看这里

结语

该篇中,我们主要了解了URL的组成部分. 下篇将介绍和HTTP报文相关的知识,希望大家一起学习.

  • 部分图片来源于网络,如有侵权,请告知。
  • 如有错误,还请指出。共勉!
  • 您的喜欢是最大的赞赏。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值