URL、URI、URN 深度解析

URI:统一资源标识符 
URL:统一资源路径地址 
URN:统一资源名称 
URI = URL + URN

一个完整的URL包含很多部分: 
http://www.html5train.com/stu/index.html?name=zf&age=9&teacher=zxt#good


第一部分:传输协议

传输协议是用来完成客户端和服务器端的数据(内容)传输的,类似于快递小哥,负责把客户和商家的物品来回传送

1、客户端不仅可以向服务器发送请求,而且还可以把一些内容传递给服务器 
2、服务器端也可以把内容返回给客户端 
客户端和服务器端传输的内容总称HTTP报文,这些报文信息都是基于传输协议完成传输的,客户端传递给服务器叫做请求(request),
服务器返回给客户端叫做响应(response),request+response两个阶段统称为一个HTTP事务(事务:一件完整的事情)

HTTP事务: 
1、当客户端向服务器端发送请求,此时客户端和服务器端会建立一个传输通道(链接通道),传输协议就是基于这个通道把信息进行传输的 
2、当服务器端接受到请求信息,把内容返回给客户端后,传输通道会自动销毁关闭

传输协议分类 
http:超文本传输协议(客户端和服务器端传输的内容除了文本以外,还可以传输图片、音视频等文件流[二进制编码/BASE64码],
以及传输xml格式的数据等),是目前市场上应用最广范的传输协议 
https:http ssl,它比http更加安全,因为数据内容的传输通道是经过ssl加密的(它需要在服务器端进行特殊的处理),
所以涉及资金类的网站一般都是https协议的 
ftp:资源文件传输协议,一般用于客户端把资源文件(不是代码)上传到服务器端,或者从服务器端下载一些资源文件
(一般ftp传输的内容会比http这类协议传输的内容多) 
…

HTTP报文

1、起始行 
请求起始行 
响应起始行

2、首部(头) 
请求头:内置请求头、自定义请求头 
响应头:内置响应头、自定义响应头 
通用头:请求和响应都有的

3、主体 
请求主体 
响应主体

请求XXX都是客户端设置的信息,服务器端获取这些信息 
响应XXX都是服务器端设置的信息,客户端用来接收这些信息

在谷歌浏览器控制台Network选项中,我们可以看见当前客户端和服务器端交互的全部信息

总结: 
客户端传递给服务器端数据 
1、URL问号传递参数 
2、设置请求头 
3、设置请求主体 
… 
服务器端返回给客户端内容 
1、设置响应头(例如服务器时间) 
2、设置响应主体 
…


第二部分:域名

设置域名其实就给不好记忆的服务器外网IP设置了一个好记忆的名字

顶级域名(一级域名):qq.com 
二级域名:www.qq.com、v.qq.com、sports.qq.com … 
三级域名:kbs.sports.qq.com 
…


第三部分:端口号

在服务器发布项目的时候,我们可以通过端口号区分当前服务器上不同的项目

一台服务器的端口号取值范围:0~65535之间,如果电脑上安装了很多程序,有一些端口号是被占用了

HTTP:默认端口号80 
HTTPS:默认端口号443 
FTP:默认端口号21

对于上述三个端口号其实是很重要的,如果被其它程序占用,我们则不能使用了;所以服务器上一般是禁止安装其它程序的;


第四部分:请求资源文件的路径名称

/stu/index.html

在服务器中发布项目的时候,我们一般都会配置一些默认文档:用户即使不输入请求文件的名称,服务器也会找到默认文档
(一般默认文档都是index/default…)

我们通常为了做SEO优化,会把一些动态页面的地址(xxx.php、xxx.aspx、xxx.asp、xxx.jsp…)进行伪URL重写(需要服务器处理的)

https://item.jd.com/4325427.html 
不可能是有一个商品,自己就单独写一个详情页面,肯定是同一个详情页做的不同处理

1)第一种方案: 
由后台语言根据详情页模板动态生成具体的详情页面 
2)第二种方案: 
当前页面就是一个页面,例如:detail.html / detail.php…,我们做详情页面的时候,开发是按照 detail.html?id=4325427 
来开发的;但是这种页面不方便做SEO优化,此时我们把真实的地址进行重写,重写为我们看到的 4325427.html


第五部分:问号传参

?name=zf&age=9…. 
把一些值通过xxx=xxx的方式,放在一个URL的末尾,通过问号传递

[ 作用 ] 

1、在AJAX请求中,我们可以通过问号传递参数的方式,客户端把一些信息传递给服务器,服务器根据传递信息的不一样,返回不同的数据

//=>$.ajax(url,{});
//=>$.get(url,function(){}); 对于AJAX请求的特殊写法,原理还是基于AJAX方法实现的  $.post / $.script ...

$.ajax({
    url:'getPersonInfo?id=12'
    ...
});
//=>当前案例,我们传递给服务器的编号是多少,服务器端就会把对应编号人员信息给返回

2、消除AJAX请求中GET方式缓存

$.ajax({
    url:'xxx?_=0.123456',
    method:'get'
});
//=>我们会在请求URL的末尾追加一个随机数 _=随机数,保证每一次请求的URL都是不一样的,以此来消除GET请求遗留的缓存问题

3、通过URL传递参数的方式,可以实现页面之间信息的通信,例如:我们有两个页面A/B,A是列表页面,B是详情页,点击A中的某一条信息,进入到唯一的详情页B,如何展示不同的信息,这种操作就可以基于URL问号传递参数来实现了

例如: 
http://sports.qq.com/kbsweb/game.htm?mid=100000:1471087 
http://sports.qq.com/kbsweb/game.htm?mid=100000:1471086 
在进入到game.htm页面的时候,我们可以获取URL传递的参数值,根据传递参数值的不一样,从服务器端获取不同的数据展示

在列表页面进行页面跳转的时候,我们需要记住的是跳转的同时传递不同的参数值 
<a href='game.html?mid=xxxx'>


第六部分:HASH值

#xxx 
URL末尾传递的井号什么,就是HASH值(哈希值)

[作用] 
1、页面中锚点定位 
2、前端路由(SPA单页面开发)