URI 通用资源标识符
网络上有很多关于 URI 与 URL 之间关系和区别错误的见解,事实上,URI 是一个给程序提供资源标识的框架,任何程序都可以使用它来标识自己的资源。先来看看他的结构
URI
= scheme
: [[userinfo
@]host
[:port
]/]path
[ ?query
] [#fragment
]
你大概能看懂其中的结构和含义,但请不必深究,实际上URI是一个相对复杂的框架,想更深入了解可以参阅 RFC3986
URI 的设计非常完善,它可以适应很多种类型的应用,很多应用也采用了 URI 作为其标识资源的方式
例如,xml 格式文件应该都熟悉,其中的顶层标签往往会有很多约束条件的配置,看起来像是网址一样,其实,那是 xml 使用了 uri 框架来标识这些约束条件,而xml的解析器有自己实现的 uri 的解析器来识别其内容。其他的例子还有很多,例如安卓系统就也使用URI框架来标识自己的资源
请注意我所使用的框架二字,这意味着它是一个实实在在被实现的程序,而不是一个标准。几乎所有语言的基础类库中都含有 URI 的构造和解构的框架,感兴趣的可以去查一查api文档试一试
当然,根据上述描述不难看出,完全相同的 URI 给不同的程序可能识别出完全不同的含义,因为其含义本身就由程序本身定义
现在你应该可以理解 URI 名字中,“通用”一词的含义了
URL 统一资源定位符
如果理解了上述 URI 的含义,其实要想理解 URL 就不难了。URL是万维网这个分布式系统使用了URI框架作为资源标识符的一个具体实现
具体来说,uri 的 scheme 被万维网定义成了 protocol(获取资源的协议),后面的部分在不同协议下有不同的含义,例如在 http 协议下,query字段被定义为 get 请求中参数的一部分,而在 file 协议下,只启用了 path 字段(file协议只能访问本机的文件系统,path 就是文件路径)。你可以理解为,万维网想通过url来简化通信报文的书写,不同的协议需要其中不同的信息来填空报文
URL 可以说是万维网思想的载体,其比任何东西都更接近万维网的本质