共计 3081 个字符,预计需要花费 8 分钟才能阅读完成。
该系列次要围绕前端一些基础性的内容进行回顾整顿,为日益纷纷的各类框架打下一个根底的底子,便于了解一些框架内容。
明天咱们次要来回顾一下有对于 URI
和URL
相干的内容。
URI 是什么
对立资源标识符(Uniform Resource Identifier,URI
),容许用户对网络中的资源通过特定的协定进行交互操作。RFC2396
文档对 Uniform Resource Identifier
各局部的定义如下。
Uniform
:规定对立的语法格局,以不便解决多种不同类型的资源,而无须依据上下文环境来辨认资源类型。Resource
:可标识的任何资源。资源不仅能够为繁多对象,也能够为多个对象的集合体。Identifier
:示意可标识的对象,也称为标识符。
在个别状况下,URI
为由某个协定计划示意的资源的定位标识符。协定计划是指拜访资源时所应用的协定类型名称。HTTP
就是协定计划的一种,除此之外,还有 FTP
、file
、TELNET
等 30 种规范 URI 协定计划。协定计划由互联网号码调配局(IANA)治理颁布。URI 应用字符串标识某一互联网资源,罕用的 URL
作为 URI
的子集,示意某一互联网资源的地点。
URI
的通用语法由 5 个组件组成:
URI = scheme:[//authority]path[?query][#fragment]
在 URI 语法中:
scheme
为协定计划名,在应用HTTPS
或HTTP
等协定计划名时不辨别大小写,最初一个符号为冒号“:”。协定计划名也可应用javascript:、data:
指定脚本程序或数据。path
为带档次的文件门路,指定服务器上的文件门路,以拜访特定的资源。query
为查问字符串,针对指定门路的文件资源,可应用查问字符串传入任意查问参数。fragment
为片段标识符,通常标记已获取资源的子资源,为可选项。authority
能够由以下 3 散布组成:
authority = [userinfo@]host[:port]
在 authority
中,userinfo
作为登录信息,通常模式为指定用户名和明码,当从服务器获取资源时作为身份认证凭证应用。userinfo
为可选项。服务器地址 host
在应用绝对路径 URI
时需指定拜访的服务器地址,地址能够为被 DNS
解析的域名,如 example.com
,或者192.168.1.1
的 IPv4 地址及用方括号括起来的 IPv6 地址 [0:0:0:0:0:0:0:1]
。port
为服务器连贯的网络端口号,作为可选项,如果不指定,则主动应用默认的端口号。
URL 是什么
对立资源定位器(UniformResourceLocators,URL
)作为 URI 的一种,如同网络的门牌,标识了一个互联网资源的“住址”,如 <http://www.example.com>
示意通过 HTTP 协定从主机名为 www.example.com
的主机上获取首页资源。
URL
的语法定义与 URI
是统一的, 它属于 URI
的一个子集。
对立资源名称 (Uniform Resource Name
) 也是规范格局的URI
,指的是资源而不指定其地位或是否存在。鉴于该概念在日常前端的范畴内接触较少,仅作为理解即可,有趣味的能够自行查阅相干内容。
URI 和 URL 的关系是什么呢
对立资源名称 (Uniform Resource Name) 也是规范格局的 URI,指的是资源而不指定其地位或是否存在。鉴于该概念在日常前端的范畴内接触较少,仅作为理解即可,有趣味的能够自行查阅相干内容。
借用一张图来了解他们之间的关系:URI 能够分为 URL,URN 或同时具备 locators 和 names 个性的一个货色。URN 作用就如同一个人的名字,URL 就像一个人的地址。换句话说:URN 确定了货色的身份,URL 提供了找到它的形式。
大白话来说,就是 URI
是形象的定义,不论用什么办法示意,只有能定位一个资源,就叫URI
。原本构想的的应用两种办法定位:1、URL
,用地址定位;2、URN
用名称定位。
举个例子:去村子找个具体的人(URI
),如果用地址:某村多少号房子第几间房的客人 - 就是 URL
;如果用身份证号 + 名字去找 - 就是URN
了。
浏览器 URI 编码
URI
编码应用的是百分号编码(Percent-encoding
)。对于须要编码的字符,将其示意为两个十六进制的数字,而后在其后面搁置转义字符“%”
,并替换原字符相应地位进行编码。
URI
中只容许蕴含未保留字符及所有保留字符。其中,未保留字符蕴含 英文字母(a~z,A~Z),数字(0~9),-、_、.、~4 个特殊字符
,共 66 个。对于未保留字符,不须要进行百分号编码。保留字符是那些具备非凡含意的字符。RFC 3986
文档中规定了 18 个保留字符:
!*'();:@&=+$,/?#[]
在 URI
中,保留字符有非凡的意义,如“?”示意查问,“#”示意片段标识。如果心愿保留字符不示意特定的意义,仅示意个别字符,那么须要对保留字符进行 URL 编码。罕用的编码方法次要有 encodeURI
和encodeURIComponent
。
encodeURI 和 encodeURIComponent
encodeURI()
和 encodeURIComponent()
都是 Javascript 中对 URL 编码的函数。
区别在于:
-
encodeURI
是W3C
的规范(RFC 3986
),不对ASCII 字母和数字
进行编码,不对 20 个 ASCII 标点符号(-、_、.、!、~、*、'、(、)、;、/、?、:、@、&、=、+、$、,、#)
进行编码。对于66 个未保留字符,18 个保留字符
,除去 2 个不平安的保留字符“[”“]”
,encodeURI
的不编码集为82
个。对于非 ASCII 字符,encodeURI
须要将其转换为UTF-8
编码字节序,而后在每个字节后面搁置转义字符(%)进行百分号编码,并置入 URI 中的相应地位。UTF-8:UTF- 8 具备无字节序要求、单字节个性节约内存、向后兼容 ASCII、谬误兼容性好等长处。一个纯 ASCII 字符串也是一个非法的 UTF- 8 字符串,所以现存的 ASCII 文本不须要转换。为传统的扩大 ASCII 字符集设计的软件通常能够不经批改或通过很少批改就能与 UTF- 8 一起应用。
-
encodeURIComponent
假设参数是URI
的一部分(比方协定、主机名、门路或查问字符串),因而,encodeURIComponent
将本义除字母、数字、“(”、“)”、“.”、“!”、“~”、“*”、“'”、“-”和“_”
外的所有字符。例如,对“name=val&key=”
进行encodeURIComponent
编码后后果为“"name%3Dval%26key%3D"”
。对于URL
组成部分中的特殊字符,通常须要应用encodeURIComponent
进行编码,如:name=encodeURIComponent('val&key=') // name=val%26key%3D
相比 encodeURIComponent
,encodeURI
被用作对一个残缺的 URI
进行编码,而 encodeURIComponent
则被用作对 URI
的一个组件或者 URI
中的一个片段进行编码。从下面的编码示例来看,encodeURIComponent
编码的字符范畴要比 encodeURI
大。
小结
以上就是针对 URI
和URL
以及相干编码方法的回顾梳理。在日常的前端开发中,URL
等概念是咱们常常提及的,而相干的编码转码办法也在咱们的日常开发中常常会用到。心愿本次回顾也可能帮忙大家重温加深一下这些常识。
参考资料
-《深刻了解 React Router 从原理到实战》