这是关于网络系列的第五篇文章,接下来会有更多精彩内容.敬请期待! 让咱们一块儿乘风破浪!html
在浩瀚的互联网中,URL就是互联网资源的标准化名称。本节,让咱们一块儿扒开URL的外衣!你能够了解到一下内容:ios
以前说URL是统一资源定位符,视乎它只是用来标识资源的位置似得。其实,不止如此!URL为用户及他们的浏览器提供的找到信息所需的全部条件,包括它位于何处,以及如何获取它或者说如何处理它
。windows
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
浏览器
下面是Cornerstone的一个目录的配置: 安全
user
信息,密码为了安全并无显示出来.
上面是一个URL的通用格式,固然几乎没有哪一个URL包含了全部这些组件。最重要的3部分是:scheme
,host
,path
.下面是各部分的说明:bash
组件 | 描述 | 默认值 |
---|---|---|
scheme | 访问服务器获取资源时使用的协议 | 无 |
user | 访问资源时使用的用户名 | 无(匿名) |
password | 用户的密码,和用户名使用: 分割 |
|
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);
复制代码
/hammers;sale=false/index.html;graphics=true
?
后面的是query组件。绝对的
和相对的
。以前的示例都是绝对的,就是从头至尾写全的;而相对的,是须要一个参照URL,被称为基础
(NSURL类中有该属性baseURL
),相对URL在HTML开发中比较常见。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每一个组成部分的容许字符集(在NSCharacterSet
的NSURLUtilities
扩展中, Swift可使用string.addingPercentEncoding(withAllowedCharacters:)
方法进行特定部分的编码,使用string.removingPercentEncoding
解码)编码
详细的讨论看这里
该篇中,咱们主要了解了URL的组成部分. 下篇将介绍和HTTP报文相关的知识,但愿你们一块儿学习.