golang中为我们提供了url.Parse,专门用来解析协议的url,比如http、https,rtsp,rtmp 等协议。
为什么能够解析这些不同的协议呢,只要遵循下面的格式即可
// 双斜杠地址
scheme://[userinfo@]host/path[?query][#fragment]
// 非双斜杠地址
scheme:opaque[?query][#fragment]
示例一:解析HTTP
func ParseHttp(clientUrl string) {
u, _ := url.Parse(clientUrl) //将string解析成*URL格式
fmt.Println(u) // go?a=123&b=456
fmt.Println(u.RawQuery) //编码后的查询字符串,没有'?' a=123&b=456
values, _ := url.ParseQuery(u.RawQuery) //返回Values类型的字典
fmt.Println(values) // map[a:[123] b:[456]]
fmt.Println(values["a"]) //[123]
fmt.Println(values.Get("b")) //456
}
func main(){
ParseHttp("http://localhost:8080/go?a=123&b=456")
}
示例二:解析RTSP
func ParseRtsp(r string) (err error) {
l, err := url.Parse(r)
if err != nil {
return err
}
fmt.Println(l.Scheme)
fmt.Println(l.Hostname())
fmt.Println(l.User.Password())
fmt.Println(l.User.Username())
fmt.Println(l.Path)
if strings.ToLower(l.Scheme) != "rtsp" {
err = fmt.Errorf("RTSP url is invalid")
return err
}
if strings.ToLower(l.Hostname()) == "" {
err = fmt.Errorf("RTSP url is invalid")
return err
}
port := l.Port()
fmt.Println(port)
if len(port) == 0 {
port = "554"
}
return nil
}
func main() {
ParseRtsp("rtsp://exp_admin:exp_passwd@192.168.5.152:554")
}