1、URI常用的形式:统一资源名称(英语:Uniform Resource Name,缩写:URN),已经基本不使用了,所以URI现在差不多可以认为就是URL。
scheme :// host:port path ? query
scheme:协议名
host:port 资源所在主机名,地址+端口,如果不写端口,浏览器使用默认的端口
path:资源所在位置,必须以“/”开始
query: 查询参数,以“?”开始,但不包含“?”。key=value字符串,用&连接
eg:
https://search.jd.com/Search?keyword=openresty&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=openresty&psort=3&click=0
2、URI的完整格式
scheme :// user:passwd@ host:port path ? query #fragment
User:passwd@ : 身份信息,但是不推荐这样使用,泄露重要信息
#fragment :片段标识符。标识URI所定位的资源内部的一个锚点,浏览器可以跳转到它指示的位置。服务器看不到#fragment
3、URI的编码
直接把非ASCII 码或特殊字符转换成十六进制字节值,然后前面加一个“%”,中文、日文等通常使用UTF-8编码后再转义。本质上uri里的非ascii码都是被编码的,这是rfc规定的。
问题:
1、HTTP 协议允许在在请求行里使用完整的 URI,但为什么浏览器没有这么做呢?
回复:
请求头的字段中都有,没必要重复
2、URI 的查询参数和头字段很相似,都是 key-value 形式,都可以任意自定义,那么它们在使用时该如何区别呢?
回复:
query参数针对的是资源(uri),而字段针对的是本次请求,也就是报文。
一个是长期、稳定的,一个是短期、临时的。两者的作用域和时效性是不一样的
escape已经被废弃了,补充一下encodeURI的原理。
把字符(unicode)编码成utf-8,utf-8是用1-4个字节表示的,所以每个字节转换成16进制并在前面用百分号(%)连接,最后并把每个字节转换的结果连接起来
RESTful是一种Web API设计风格,以http协议传输数据,接口使用uri,使用get/post等方法来表示操作。
和WebService、gRPC不同,它不是强制的,只是一种指导意见,遵守它可以写出易理解、易维护的Web服务
访问网页的时候,都是只有域名没有端口号。dns只解析ip地址,端口号是浏览器添加的。如果不提供端口号,浏览器就会添加默认端口号,比如80/443
地址栏里的query参数是uri的一部分,当然是在请求头里。
URI的编码
URI里只能使用ASCII码,但可以通过编码机制,对于ASCII码以外的字符集和特殊字符左一个转义操作,也即escape和unescape,转义和反转义。(目前已被废弃,现在的encodeURI原理是把字符(unicode)编码成utf-8,utf-8用1-4个字节表示,所以每个字节换成16进制并在签名用%链接,最后把每个字节转换的结果链接起来。)
URI的转义规则就是把非ASCII码或特殊字符转换成十六进制字节值,然后在前面加上一个%符。例如,空格转义成”%20“,?转义成”%3f“,而中文、日文则通常使用UTF-8编码后再转义,例如“银河”会被转义成“ %E9%93%B6%E6%B2%B3“。
这个转码规则令URI更加完美,可以支持任意的字符集用任何语言来标记资源。