关于前端:前端基础回归URI和URL

51次阅读

共计 3081 个字符,预计需要花费 8 分钟才能阅读完成。

该系列次要围绕前端一些基础性的内容进行回顾整顿,为日益纷纷的各类框架打下一个根底的底子,便于了解一些框架内容。

明天咱们次要来回顾一下有对于 URIURL相干的内容。

URI 是什么

对立资源标识符(Uniform Resource Identifier,URI),容许用户对网络中的资源通过特定的协定进行交互操作。RFC2396文档对 Uniform Resource Identifier 各局部的定义如下。

  • Uniform:规定对立的语法格局,以不便解决多种不同类型的资源,而无须依据上下文环境来辨认资源类型。
  • Resource:可标识的任何资源。资源不仅能够为繁多对象,也能够为多个对象的集合体。
  • Identifier:示意可标识的对象,也称为标识符。

在个别状况下,URI为由某个协定计划示意的资源的定位标识符。协定计划是指拜访资源时所应用的协定类型名称。HTTP就是协定计划的一种,除此之外,还有 FTPfileTELNET 等 30 种规范 URI 协定计划。协定计划由互联网号码调配局(IANA)治理颁布。URI 应用字符串标识某一互联网资源,罕用的 URL 作为 URI 的子集,示意某一互联网资源的地点。

URI的通用语法由 5 个组件组成:

URI = scheme:[//authority]path[?query][#fragment]

在 URI 语法中:

  • scheme为协定计划名,在应用 HTTPSHTTP等协定计划名时不辨别大小写,最初一个符号为冒号“:”。协定计划名也可应用 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 编码。罕用的编码方法次要有 encodeURIencodeURIComponent

encodeURI 和 encodeURIComponent

encodeURI()encodeURIComponent() 都是 Javascript 中对 URL 编码的函数。

区别在于:

  • encodeURIW3C 的规范(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

相比 encodeURIComponentencodeURI 被用作对一个残缺的 URI 进行编码,而 encodeURIComponent 则被用作对 URI 的一个组件或者 URI 中的一个片段进行编码。从下面的编码示例来看,encodeURIComponent编码的字符范畴要比 encodeURI 大。

小结

以上就是针对 URIURL以及相干编码方法的回顾梳理。在日常的前端开发中,URL等概念是咱们常常提及的,而相干的编码转码办法也在咱们的日常开发中常常会用到。心愿本次回顾也可能帮忙大家重温加深一下这些常识。

参考资料

-《深刻了解 React Router 从原理到实战》

正文完
 0