谈一谈URL
作者:ManfredHu
链接:http://www.manfredhu.com/2017/08/16/22-url/index.html
声明:版权所有,转载请保留本段信息,谢谢大家
URL
URL
普及篇,作为互联网从业者如果连链接都不认识,很难交流。不知道你们有没有遇到这样的情况,开发要给产品一个链接叫产品体验,开发说打开链接加个_test=1的参数,产品说,怎么搞啊,我不会呀!!!我不会呀!!!我不会呀!!!所以要普及一些网络姿势!!
URL的由来
我们的身份证有18个号码,标识了我们的唯一。
URL全称Uniform Resource Locator 统一资源定位符(或称统一资源定位器/定位地址、URL地址等,常缩写为URL),有时也被俗称为网页地址(网址)。如同在网络上的门牌,是因特网上标准的资源的地址(Address)。它最初是由蒂姆·伯纳斯-李发明用来作为万维网的地址。现在它已经被万维网联盟编制为因特网标准RFC 1738。
URL的组成部分
URL的协议类型:
- http://www.tmtpost.com/2737087.html?mobile=1&mdebug=1#haha=init&lh=1
- [scheme:][//host][:port][/pathname][?search][#hash]
- [http:][//www.tmtpost.com][/2737087.html][?mobile=1&mdebug=1][#haha=init&lh=1]
举个栗子,如下URL:
http://www.tmtpost.com/2737087.html?mobile=1&mdebug=1#haha=init&lh=1
标识了一个互联网上的文件的地址。
在控制台输入window.location 会输出信息,大概如下
|
1
2
3
4
5
6
7
8
9
10
|
Location
hash:"#haha=init&lh=1"
host:"www.tmtpost.com"
hostname:"www.tmtpost.com"
href:"http://www.tmtpost.com/2737087.html?mobile=1&mdebug=1#haha=init&lh=1&test=1"
origin:"http://www.tmtpost.com"
pathname:"/2737087.html"
port:""
protocol:"http:"
search:"?mobile=1&mdebug=1"
|
| 格式部分 | 例子对应的部分 | 获取代码 |
|---|---|---|
| protocol | http: | window.location.protocol |
| host | //www.tmtpost.com | window.location.host |
| port | http默认为80,https默认为443,本例为空 | window.location.port |
| pathname | /2737087.html | window.location.pathname |
| search | ?mobile=1&mdebug=1 | window.location.search |
| hash | #haha=init&lh=1 | window.location.hash |
window.location.href 和 window.location.replace
window.location.href是一个可读可写的属性。读则返回整个URI字符串,写则跳转页面。window.location.replace是一个方法,同样用于页面跳转,只是同时会把历史纪录替换掉,所以你后退回不去原来的链接,而window.location.href是有记录的。
注意:这里只可以跳转到同个host下的不同pathname。
|
1
2
3
4
5
|
//如果你打开www.baidu.com在控制台输入
window.location.href = "www.qq.com";
//则url会变成 https://www.baidu.com/www.qq.com
//百度会告诉你它根本不认识这货而跳转到错误搜索
//测试环境为Chrome
|
构建URL
业务中经常会用URL的参数,通常是 location.search 这里的部分来做一些业务相关的操作,比如某些功能的体验,加了一个参数就可以打开体验等等。这里通常就是操作
http://www.tmtpost.com/2737087.html?mobile=1&mdebug=1#haha=init&lh=1
这样链接的 ?mobile=1&mdebug=1部分,通过添加其他参数来构成URL.
比如我们上面情景下的开发哥哥想要你加上_test=1。
那么就会形成 ?mobile=1&mdebug=1&_test=1的search部分。
这里参数以&符号来分割。
总的链接为
http://www.tmtpost.com/2737087.html?mobile=1&mdebug=1&_test=1#haha=init&lh=1
这就是开发哥哥想要的URL了。
HASH的读写
location.hash为获取的hash,通常的单页SPA下会通过hash的变化来判断执行的模块方法。这块通常也是一些基础面试里面会问到的题目,让你现场写一个东西来获取URL里面的参数,因为场景太常用了,所以是必修题。记得在大三去微信TIT面试的时候有一道就是这样的,考察的是JS正则表达式的使用和对URL的理解是否深刻。
hash的常见类型如: #haha=init&lh=1&test=1
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
var URL = {};
URL.setHash = function(hash){
location.hash = hash;
}
URL.getHash = function(){
var hash = location.hash;
return hash ? hash.replace(/.*#/,""):""; //删除掉#前面(包括#)的所有字符
}
URL.getHashParam = function(key){
var hash = URL.getHash();
//这里会取到haha=init&lh=1这样的字符串,用正则来捕获key为传入key的值
var result = hash.match(new RegExp("(^|&)"+ key +"=([^&]*)(&|$)"));
return result != null ? result[2]: "";
}
|
SEARCH部分
location.search部分为?号 后面的内容,跟HASH类似,也是key=value的模式。
search的常见类型如: ?mobile=1&mdebug=1&_test=1
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
var URL = {};
//HASH部分
URL.setHash = function(hash){
location.hash = hash;
}
URL.getHash = function(){
var hash = location.hash;
return hash ? hash.replace(/.*#/,""):""; //删除掉#前面(包括#)的所有字符
}
URL.getHashParam = function(key){
var hash = URL.getHash();
//这里会取到haha=init&lh=1这样的字符串,用正则来捕获key为传入key的值
var result = hash.match(new RegExp("(^|&)"+ key +"=([^&]*)(&|$)"));
return result != null ? result[2]: "";
}
//SEARCH部分
URL.getSearch = function(){
var search = location.search; //得到形如 ?mobile=1&mdebug=1 这样的字符串
return search ? search.replace(/.*?/,""):""; //删除掉?前面(包括?)的所有字符
}
//支持传入url
URL.getSearchParam = function(key,url){
var search = url ? url :URL.getSearch();
//这里会取到haha=init&lh=1这样的字符串,用正则来捕获key为传入key的值
var result = search.match(new RegExp("(^|&)"+ key +"=([^&]*)(&|$)"));
return result != null ? result[2]: "";
}
|
URL编码解码
window全局对象下有几个方法函数是对URL进行处理的。有这些
window.decodeURIwindow.encodeURIwindow.decodeURIComponentwindow.encodeURIComponentwindow.unescapewindow.escape
很明显,这是三对类似的情侣。相爱相杀,一个用来解码一个用来编码。
首先,我们看一下阮一疯的关于URL编码这里先入个门再来看我们下面的总结部分。
废弃的escape和unescape
这一对可以对中文进行编解码操作,以前用的比较多,现在已经不提倡使用(废弃)看下面的例子:
|
1
2
3
4
|
escape("醉了")
//"%u9189%u4E86"
unescape("%u9189%u4E86")
//"醉了"
|
同理我们可以对比String.charCodeAt方法,这个方法会返回字符串某个字符的unicode编码。
escape和String.charCodeAt方法的联系
|
1
2
3
4
|
"醉了".charCodeAt(0) //37257(十进制)
"醉了".charCodeAt(1) //20102(十进制)
parseInt(escape("醉").match(/\d+/)[0],16) //37257(十进制)
parseInt(escape("了").match(/\d+/)[0],16) //20102(十进制)
|
这里我们用escape编码 醉字得到字符的unicode编码"%u9189",然后用String.match匹配整数部分得到16进制的9189,然后用parseInt方法将9189转码为十进制得到与charCodeAt方法一样的数字——37257
encodeURI和decodeURI
这一对会对一些符号进行编码(如空格转为%20),其他一些在网址中有特殊含义的符号”; / ? : @ & = + $ , #”,不进行编码。编码后,它输出符号的utf-8形式,并且在每个字节前加上%。
|
1
2
3
4
5
6
|
encodeURI("醉了")
//"%E9%86%89%E4%BA%86"
encodeURI("醉了 ")
//"%E9%86%89%E4%BA%86%20"
decodeURI("%E9%86%89%E4%BA%86%20")
//"醉了 "
|
encodeURIComponent和decodeURIComponent
与encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。
因此,”; / ? : @ & = + $ , #”,这些在encodeURI()中不被编码的符号,在encodeURIComponent()中统统会被编码
|
1
2
3
4
|
encodeURI('哈哈hao123;/?:@&=+$,#')
"%E5%93%88%E5%93%88hao123;/?:@&=+$,#"
encodeURIComponent('哈哈hao123;/?:@&=+$,#')
"%E5%93%88%E5%93%88hao123%3B%2F%3F%3A%40%26%3D%2B%24%2C%23"
|
escape和encodeURIComponent的区别
上例说了encodeURI和encodeURIComponent的区别,区别不大.只是在; / ? : @ & = + $ , #这些特殊符号编不编码的问题.
而escape和encodeURI的区别则是——Unicode编码和UTF-8的区别.
因为escape会将传入的字符串参数转码为Unicode,而encodeURI则会将传入的字符串参数转码为可以直接在互联网传递的UTF-8格式.
Unicode和UTf-8
UTF-8
UTF-8是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则很简单,只有二条:
- 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
- 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
对照关系如下:
| Unicode符号范围(十六进制) | UTF-8编码方式(二进制) |
|---|---|
| 0000 0000-0000 007F | 0xxxxxxx |
| 0000 0080-0000 07FF | 110xxxxx 10xxxxxx |
| 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
| 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
Unicode和UTF-8的转化
以醉了的醉字为例
|
1
2
3
4
|
"醉".charCodeAt(0)
//37257(十进制)
encodeURI('醉')
//"%E9%86%89"
|
可以这里醉字的UTF-8编码为三字节,E9 86 89
转化为二进制为 11101001 10000011 10001001
对应上面表格的第三行,将其代入第三行的UTF-8编码的部分,得到替代的x部分为1001 000011 001001则为醉字的Unicode编码部分.
|
1
2
3
4
5
6
|
parseInt('1001 000011 001001'.replace(/\s/g,''),2)
//37065
"醉".charCodeAt(0)
//37257(十进制)
parseInt(escape('醉').match(/\d+/)[0],16)
//37257(十进制)
|
谈一谈URL的更多相关文章
- 谈一谈APP版本号问题
如题:谈一谈APP版本号问题 为什么要谈这个问题,周五晚上11~12点,被微信点名,说APP有错,无效的版本号,商城无法下单.我正在准备收拾东西,周末回老家,结果看到这样问题,菊花一紧.我擦,我刚加的 ...
- 谈一谈Java8的函数式编程(二) --Java8中的流
流与集合 众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...
- 谈一谈泛型(Generic)
谈一谈泛型 首先,泛型是C#2出现的.这也是C#2一个重要的新特性.泛型的好处之一就是在编译时执行更多的检查. 泛型类型和类型参数 泛型的两种形式:泛型类型( 包括类.接口.委托和结构 没有泛型枚 ...
- 从一张图开始,谈一谈.NET Core和前后端技术的演进之路
从一张图开始,谈一谈.NET Core和前后端技术的演进之路 邹溪源,李文强,来自长沙.NET技术社区 一张图 2019年3月10日,在长沙.NET 技术社区组织的技术沙龙<.NET Core和 ...
- 谈一谈Elasticsearch的集群部署
Elasticsearch天生就支持分布式部署,通过集群部署可以提高系统的可用性.本文重点谈一谈Elasticsearch的集群节点相关问题,搞清楚这些是进行Elasticsearch集群部署和拓 ...
- 谈一谈iOS事件的产生和传递
谈一谈iOS事件的产生和传递 1.事件的产生 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中. UIApplication会从事件队列中取出最前面的事件,并将事件 ...
- 谈一谈对MySQL InnoDB的认识及数据库事物处理的隔离级别
介绍: InnoDB引擎是MySQL数据库的一个重要的存储引擎,和其他存储引擎相比,InnoDB引擎的优点是支持兼容ACID的事务(类似于PostgreSQL),以及参数完整性(有外键)等.现在Inn ...
- 谈一谈深度学习之semantic Segmentation
上一次发博客已经是9月份的事了....这段时间公司的事实在是多,有写博客的时间都拿去看paper了..正好春节回来写点东西,也正好对这段时间做一个总结. 首先当然还是好好说点这段时间的主要工作:语义分 ...
- 蓝的成长记——追逐DBA(5):不谈技术谈业务,恼人的应用系统
***************************************声明*************************************** 个人在oracle路上的成长记录,当中 ...
- 谈一谈并查集QAQ(上)
最近几日理了理学过的很多oi知识...发现不知不觉就有很多的知识忘记了... 在聊聊并查集的时候顺便当作巩固吧.... 什么是并查集呢? ( Union Find Set ) 是一种用于处理分离集合的 ...
随机推荐
- Python 面向对象进阶(二)
1. 垃圾回收 小整数对象池 Python对小整数的定义是 [-5, 257),这些整数对象是提前建立好的; 在一个Python程序中,所有位于这个范围内的整数,使用的都是同一个对象; 单个字符共用对 ...
- 剑指Offer——扑克牌顺子
题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他 ...
- Linux more命令
more命令类似与cat命令,却比cat命令强大,它以全屏幕的方式按页显示文本文件的内容,支持vi中的关键字定位操作. 1.快捷键 space, z 向下翻页b,ctrl+b 向上翻页 E ...
- (0.2)linux下Mysql的安装配置与管理入门(目录篇)
本章学习内容: 1.基于Linux平台的Mysql项目场景介绍 1.1.互联网各类网站.购物网站.门户网站.博客系统.IDC,云平台,VPS,虚拟主机空间,论坛,嵌入式. 2.mysql数据库运行环境 ...
- Linux系统性能调优之性能分析
1.Linux性能分析的目的1)找出系统性能瓶颈(包括硬件瓶颈和软件瓶颈):2)提供性能优化的方案(升级硬件?改进系统系统结构?):3)达到合理的硬件和软件配置:4)使系统资源使用达到最大的平衡.(一 ...
- 009-Shell 函数
一.函数定义 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action; ...
- wireshark抓TCP包
tcpdump下载 如果要抓TCP数据包,我们可以使用TCPdump工具,类似于windows/linux下使用的这个工具一样.具体方法是 下载tcpdump, 还有个下载地址 详细使用请参考里面的文 ...
- oracle的字符集设置与乱码
oracle的字符集设置与乱码 字符集问题一直叫人头疼,究其原因还是不能完全明白其运作原理. 在整个运行环节中,字符集在3个环节中发挥作用: 1.软件在操作系统上运作时的对用户的显示,此时采用操作系统 ...
- 64. Minimum Path Sum(最小走棋盘 动态规划)
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...
- iClap:更智能的场景化工作方式
8月31日,移动互联网企业运营解决方案整合平台DevStore团队正式推出新品——产品管理系统iClap,iClap集成了智能任务管理.Bug跟踪.简单发布.人才培养等功能,同时推出普通版和旗舰版两个 ...