URL 语法
URL提供了一种定位因特网上任意资源的手段,但这些资源是可以通过各种不同的方案(比如HTTP、FTP、SMTP)来访问,因此URL语法会随着方案的不同而不同。
<schema>://<user>:<password>@<host>:<port>/<path>:<params>?<query>#<frag>
scheme: 方案是如何访问指定资源的主要标识符,他会告诉负责解析URL应用程序应该使用什么协议。
host: 主机组件标识了因特网上能够访问资源的宿主机器,可以有主机名或者是IP地址来表示。
port: 端口标识了服务器正在监听的网络端口。默认端口号是80。
path: URL的路径组件说明了资源位于服务器的什么地方。
params: URL中通过协议参数来访问资源,比名值对列表,分号分割来进行访问。
query: 字符串是通过提问问题或进行查询来缩小请求资源类的范围。frag: 为了引用部分资源或资源的一个片段,比如URL指定HTML文档中一个图片或一个小节。HTTP通常只处理整个对象,而不是对象的片段,客户端不能将片段传送给服务器。浏览器从服务器获取整个资源之后,会根据片段来显示你感兴趣的片段部分。
net/url 解析demo
s:="mysql+pymysql://base:base-testdempo123@rr-2zeqddi95ss6s26cddz62o.mysql.rds.aliyuncs.com:3306/dbtest?charset=utf8&test=test#12345"
u,err:=url.Parse(s)
if err!=nil{
panic(err)
}
fmt.Println(reflect.TypeOf(u)) //*url.URL
fmt.Println(u.Opaque)
fmt.Println(u.ForceQuery) //false
//user 包含了所有的验证信息
fmt.Println(u.User) // base:base-testdempo123
fmt.Println(u.User.String()) //base:base-testdempo123
fmt.Println(u.User.Username()) //base
fmt.Println(u.User.Password()) //base-testdempo123 true
// 解析后的Scheme
fmt.Println(u.Scheme) //mysql+pymysql
//解析出路径
fmt.Println(u.Path) // /dbtest
fmt.Println(u.Fragment) //12345
fmt.Println(u.RawPath)
//host 包含了主机名和端口
fmt.Println(u.Host) //rr-2zeqddi95ss6s26cddz62o.mysql.rds.aliyuncs.com:3306
fmt.Println(u.RawQuery) //charset=utf8&test=test
s:="mysql+pymysql://base:base-testdempo123@rr-2zeqddi95ss6s26cddz62o.mysql.rds.aliyuncs.com:3306/dbtest?charset=utf8&test=test#12345"
u,err:=url.Parse(s)
if err!=nil{
panic(err)
}
fmt.Println(reflect.TypeOf(u)) //*url.URL
fmt.Println(u.String())
fmt.Println(reflect.TypeOf(u.String()))
fmt.Println(u.Port())
fmt.Println(u.Query()) map[charset:[utf8] test:[test]]
fmt.Println(u.Hostname())
fmt.Println(reflect.TypeOf(u.Hostname()))