当前位置: 首页 > Web前端 > HTML

前端基础回归——URI和URL

时间:2023-03-28 01:43:37 HTML

本系列主要是对前端的一些基础内容进行回顾和梳理,为日趋多样化的框架打下基础,更容易理解一些框架内容。今天我们主要复习URI和URL相关的内容。什么是URI?统一资源标识符(URI),允许用户通过特定协议与网络中的资源进行交互。RFC2396文档对统一资源标识符的各个部分定义如下。Uniform:规定了统一的语法格式,方便处理各种类型的资源,而无需根据上下文来识别资源类型。资源:任何可以识别的资源。资源不仅可以是单个对象,还可以是多个对象的集合。标识符:表示可识别的对象,也称为标识符。通常,URI是由协议方案表示的资源的位置标识符。协议方案是访问资源时使用的协议类型的名称。HTTP是协议方案之一。此外,还有FTP、file、TELNET等30种标准的URI协议方案。协议方案由互联网号码分配机构(IANA)管理和发布。URI使用字符串来标识Internet资源,常用的URL是URI的一个子集来表示Internet资源的位置。URI的一般语法由5个部分组成:URI=scheme:[//authority]path[?query][#fragment]URI语法中:scheme是协议scheme的名称,使用protocolscheme时不用名称如HTTPS或HTTP区分大小写,最后一个符号是冒号“:”。协议方案名也可以使用javascript:、data:来指定脚本程序或数据。path是分层文件路径,指定服务器上的文件路径以访问特定资源。查询是一个查询字符串。对于指定路径的文件资源,可以使用查询字符串传入任意查询参数。Fragment是一个片段标识符,通常标记获取资源的子资源,可选。authority可以由以下三个分布组成:authority=[userinfo@]host[:port]authority中userinfo作为登录信息,通常以指定用户名和密码的形式,在获取时作为身份认证凭证来自服务器的资源。用户信息是可选的。服务器地址host在使用绝对路径URI时需要指定要访问的服务器地址。地址可以是DNS解析的域名,例如example.com,也可以是192.168.1.1的IPv4地址和方括号[0:0:0:0:0:0:0:1]中的IPv6地址.port是连接到服务器的网络端口号,作为一个选项,如果不指定,将自动使用默认端口号。什么是网址?统一资源定位符(UniformResourceLocators,URL)作为URI的一种,就像网络上的门牌号,标识了互联网资源的“地址”。获取主机名为www.example.com的主机上的主页资源。URL的语法定义与URI一致,属于URI的一个子集。统一资源名称也是一种标准格式的URI,它引用资源而不指定其位置或存在。鉴于概念在日常前端范围内接触较少,仅作了解,有兴趣的可以自行查阅相关内容。URI和URL是什么关系?统一资源名称(UniformResourceName)也是一种标准格式的URI,它指的是一个资源而不指定它的位置或存在。鉴于概念在日常前端范围内接触较少,仅作了解,有兴趣的可以自行查阅相关内容。借张图理解一下它们之间的关系:URI可以分为URL、URN或者兼具locators和names特征的东西。URN就像一个人的名字,而URL就像一个人的地址。换句话说:URN标识事物,URL提供查找它的方法。通俗地说,URI是一个抽象定义。不管用什么方法来表达,只要能定位到一个资源,就称为URI。原本设想使用两种定位方式:1.URL,使用地址定位;2.URN使用名称定位。比如:去一个村子找一个特定的人(URI),如果用地址:某个村子的房子第一个房间的主人——就是URL;如果您使用ID号+姓名来查找它-它就是URN。浏览器URI编码URI编码使用百分比编码。对于需要编码的字符,表示为两个十六进制数,然后在其前面加上转义符“%”,替换原字符对应的位置进行编码。URI中只允许使用非保留字符和所有保留字符。其中,非保留字符包括英文字母(a~z、A~Z)、数字(0~9)、-、_、.、~4个特殊字符,共66个。对于非保留字符,百分号编码不是必需的。保留字符是那些具有特殊含义的字符。RFC3986文档规定了18个保留字符:!*'();:@&=+$,/?#[]在URI中,保留字符有特殊含义,如“?”用于查询,“#”表示分片ID。如果希望保留字符不代表具体含义,只代表一般字符,则需要对保留字符进行URL编码。常用的编码方式主要有encodeURI和encodeURIComponent。encodeURI和encodeURIComponentencodeURI()和encodeURIComponent()是Javascript中的URL编码函数。区别在于:encodeURI是W3C标准(RFC3986),不对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将转义除字母、数字、“(”、“)”、“.”、“!”之外的所有内容。、“~”、“*”、“'”、“-”和“_”。例如,使用encodeURIComponent编码“name=val&key=”的结果是“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从原理到实战》