为了清晰描述网络资源的位置,计算机先驱们捣鼓出了URI URL URN这些逻辑模型。
首先URI叫做统一资源标识符,为了表示网络中的资源,必须确定严谨的语法
URI语法如下
([]表示可有可无)
[ scheme : ] scheme-specific-part[ # fragment]
其中scheme-specific-part结构如下,其中//可以没有
[ //][ authority][ path][ ? query]
其中authority结构如下,注意:如果URI中存在authority字段,那么必有host字段
[ user-info @] host [ : port]
所以URI结构如下
[ scheme :][ user-info @] host [ : port][ path][ ? query][ # fragment]
任何正确URL结构必须遵守如上规定
下面我来举几个例子
首先是我们最熟悉http请求行,我们来解析它
http://www.mysite.com/p1/test.html?param1=a¶m2=b#1
解析结果如下
scheme = http
scheme-specific-part = //www.mysite.com/p1/test.html?param1=a¶m2=b
authority = www.mysite.com
path = /p1/test.html
query 是 param1=a¶m2=b
fragment = 1
其中没有使用到user-info字段,还有host和post就不写了。
接下来解析大家也熟悉的ftp
ftp://admin:[email protected]/profile
表示用户名admin 密码passwd的用户登录到profile文件夹中
scheme = ftp
scheme-specific-part = //admin:[email protected]/profile
authority = //admin:[email protected]
path = /profile
user-info = admin:passwd
现在来看个本地文件协议
file:///f:/flash/1.swf
它的的URI解析如下
scheme = file
scheme-specific-part = ///f:/flash/1.swf
authority = 木有
path = /f:/flash/1.swf
因为没有authority字段,所以就出现引人注目的///这种情况了
再来分析个磁力矩
magnet:?xt=urn:btih:2F9D75F4CB3385CB06FFB30695A34FAC7033902C
它的的URI解析如下
scheme = magnet
scheme-specific-part = ?xt=urn:btih:D5SG5FD43A21SGASDFQ123FB30695A34FAC7033902C
authority = 木有
// = 木有
path = 木有
query 是 xt=urn:btih:D5SG5FD43A21SGASDFQ123FB30695A34FAC7033902C
总结:
任何网络中的资源都需要URI进行位置描述。换句话说,我们在编程时,想获取任何网络上的资源(包括本机)都必须先为资源定义一个URI(资源描述符)。
其他
当然URI模型并非只有语法规范,还有编码规范和行为规范(规范化,解析,相对化)
这些内容将在我的文章URI解析-编码规范 ,URI解析-行为规范 中详细解析(还在写)。