URI是统一资源标识符(Uniform Resource Identifier),URL是统一资源定位符(Uniform Resource Locator)。
具体如何标记和区分服务器上的资源用的其实就是URI,因为其经常出现在浏览器的地址栏里,所以也俗称“网址”。但实际上URI和URL并不是一个东西,只不过HTTP的世界里通常网址都是URL,所以二者有时候被混淆了。
URI格式
下面的这张图显示了 URI 最常用的形式,由 scheme、host:port、path 和 query 四个部分组成,但有的部分可以视情况省略。
URI的基本组成
scheme
就是协议名,一般是http、https、ftp等,浏览器或者应用程序看到scheme后会调用下游相应API,没有scheme后面的东西就没法处理。
在 scheme 之后,必须是三个特定的字符“😕/”,它把 scheme 和后面的部分分离开。
authority
表示资源所在主机名,通常形式是host:port
主机名可以是 IP 地址或者域名的形式,必须要有,否则浏览器就会找不到服务器。但端口号有时可以省略,浏览器等客户端会依据 scheme 使用默认的端口号,例如 HTTP 的默认端口号是 80,HTTPS 的默认端口号是 443。
有了协议名和主机地址、端口号,再加上后面标记资源所在位置的path,浏览器就可以连接服务器访问资源了。path 采用了类似文件系统“目录”“路径”的表示方式,因为早期互联网上的计算机多是 UNIX 系统,所以采用了 UNIX 的“/”风格。
URI 的 path 部分必须以“/”开始,也就是必须包含“/”,不要把“/”误认为属于前面 authority。
query
URI 后面还有一个“query”部分,这是对请求的服务器资源进行额外操作需要的参数,例如商品列表分页等情况,它在 path 之后,用一个“?”开始,但不包含“?”,表示对资源附加的额外要求。
查询参数 query 有一套自己的格式,是多个“key=value”的字符串,这些 KV 值用字符“&”连接,浏览器和客户端都可以按照这个格式把长串的查询参数解析成可理解的字典或关联数组形式。
URI编码
正常来说URI仅支持ASCII的,但是中文、日文或者有特殊含义的“&?”等字符咋办呢?这里就需要转义了。它们都需要转为十六进制并在转成的16进制前加上%