1.URI 是用来唯一标记服务器上资源的一个字符串,通常也称为 URL;
URI,也就是统一资源标识符(Uniform Resource Identifier)
URL——统一资源定位符(Uniform Resource Locator)
2.URI 通常由 scheme、host:port、path 和 query 四个部分组成,有的可以省略;
3.scheme 叫“方案名”或者“协议名”,表示资源应该使用哪种协议来访问;
scheme,翻译成中文叫“方案名”或者“协议名”,表示资源应该使用哪种协议来访问。最常见的当然就是“http”了,表示使用 HTTP 协议。另外还有“https”,表示使用经过加密、安全的 HTTPS 协议。此外还有其他不是很常见的 scheme,例如 ftp、ldap、file、news 等。
4.“host:port”表示资源所在的主机名和端口号;
5.path 标记资源所在的位置;
6.query 表示对资源附加的额外要求;
7.在 URI 里对“@&/”等特殊字符和汉字必须要做编码,否则服务器收到 HTTP 报文后会无法正确处理。
片段标识符“#fragment”,它是 URI 所定位的资源内部的一个“锚点”或者说是“标签”,浏览器可以在获取资源后直接跳转到它指示的位置。
URI 的编码
URI 引入了编码机制,对于 ASCII 码以外的字符集和特殊字符做一个特殊的操作,把它们转换成与 URI 语义不冲突的形式。这在 RFC 规范里称为“escape”和“unescape”,俗称“转义”
URI 转义的规则有点“简单粗暴”,直接把非 ASCII 码或特殊字符转换成十六进制字节值,然后前面再加上一个“%”。
在浏览器的地址栏里通常是不会看到这些转义后的“乱码”的,这实际上是浏览器一种“友好”表现,隐藏了 URI 编码后的“丑陋一面”
http://www.chrono.com:8080/11-1
https://tools.ietf.org/html/rfc7230
file:///D:/http_study/www/
第一个 URI 算是最简单的了,协议名是“http”,主机名是“nginx.org”,端口号省略,所以是默认的 80,而路径部分也被省略了,默认就是一个“/”,表示根目录。
第二个 URI 是在实验环境里这次课程的专用 URI,主机名是“www.chrono.com”,端口号是 8080,后面的路径是“/11-1”。
第三个是 HTTP 协议标准文档 RFC7230 的 URI,主机名是“tools.ietf.org”,路径是“/html/rfc7230”。
最后一个 URI 它的协议名不是“http”,而是“file”,表示这是本地文件,而后面居然有三个斜杠,这是怎么回事?
如果你刚才仔细听了 scheme 的介绍就能明白,这三个斜杠里的前两个属于 URI 特殊分隔符“://”,然后后面的“/D:/http_study/www/”是路径,而中间的主机名被“省略”了。这实际上是 file 类型 URI 的“特例”,它允许省略主机名,默认是本机 localhost。
但对于 HTTP 或 HTTPS 这样的网络通信协议,主机名是绝对不能省略的。原因之前也说了,会导致浏览器无法找到服务器。我们可以在实验环境里用 Chrome 浏览器再仔细观察一下 HTTP 报文里的 URI。运行 Chrome,用 F12 打开开发者工具,然后在地址栏里输入“http://www.chrono.com/11-1”,得到的结果如下图。
查询参数query太长,可以使用GET方法,把参数放在body里 发给server.