2.url一般语法,正如由许多不同的获取资源的方法一样,描述这些资源的位置也有多种方案。不同的协议有不同的 url语法,但是url的通用语法为其他协议建立新的方案提供了框架,一般而言url的编写方式如下:<scheme>:<scheme-specific-part> url包含特定的协议名称<scheme>后面是冒号,然后是字符串,该字符串的解释取决于不同协议的具体实现。
虽然url除协议外的其余部分的语法可能会因特定协议而有所不同,但涉及直接对internet上的指定主机使用基于ip的协议的url <scheme-specific-part> 拥有通用的语法://<user>:<password>@ <password> <port>和<url-path> 都是可选的,url协议特定部分以双斜杠 //开头,表明它符合通用internet协议语法。不同的组件遵循以下规则:user 一个可选的用户名。有些协议例如ftp允许指定用户名 password 一个可选的密码。如果存在,则在用户后面用冒号分割。
HTTP(S) URL 在了解了 URL 基本概念以及基本组成结构后,下面重点讲解 HTTP URL 的语法
http(s)://<host>:<port>/<path>?<query>#<frag>
2.<host>:主机名。一个 URL 中,既可以使用域名也可以使用 IP 表示主机地址;
4.<path>:资源路径。资源在网络主机上的路径,路径也是可选的,缺省访问默认资源;
6.<frag>:片段。从 # 开始到最后,一般用于定位到资源内的一个片段,比如文档的一个章节;片段也是可选的。
观察示例,对照 HTTP URL 的格式,我们可以知道:
2.www.aspxfans.com 为主机域名;
4.news/index.asp 为资源路径;
6.name 为资源内的一个片段。
6.URL 编码
URL 是一个字符序列,由数字、字母和特殊字符组成。对 URL 进行编码主要原因有如下几点:
不安全的字符:由于多种原因,有些字符可能是不安全的。比如空字符是不安全的,因为当 URL 被排版或接受文字处理程序处理时,重要的空格可能会消失,也可能会引入无关紧要的空格。字符 < 和 > 是不安全的,因为它们被用作自由文本中 URL 周围的分隔符。引号"用于在某些系统中分隔 URL。字符 # 不安全,应该总是被编码,因为它用于万维网和某些协议(如 HTTP(S))中片段/锚的分隔符。字符 % 不安全,因为它用于其他字符的编码。还有些字符也不安全,因为已知网关和其他传输代理有时会修改这样的字符,这些字符有:{ } | \ ^ ~ ` [ ]。
6.2 URL 编码规则
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
除了上面非保留字符,其他任何字符出现在 URL 的不同部分时,如果与该部分的保留字符发生冲突或不可打印或超出 ASCII 表示范围,均需要对其编码。
URL 的编码方式也比较简单,即使用字符 % 后跟两个十六进制数字(0123456789ABCDEF 或 0123456789abcdef)表示字符码值的单个字节值。比如:
https://www.baidu.com/s?wd=%E6%98%A5%E8%8A%82
以 Go 为例,可以使用 url.QueryEscape 和 url.QueryUnescape 实现参数的编码和解码。
package mainimport ( "net/url")func main() { param := "春节" fmt.Println(url.QueryEscape(param)) fmt.Println(url.QueryUnescape(url.QueryEscape(param)))}