package helper import ( "encoding/base64" "net/url" "strings" ) type Url struct { str string } func NewUrl(str string) *Url { return &Url{str} } //解析 URL // -1: all; 1: scheme; 2: host; 4: port; 8: user; 16: pass; 32: path; 64: query; 128: fragment func (l *Url) ParseURL(component int) (map[string]string, error) { u, err := url.Parse(l.str) if err != nil { return nil, err } if component == -1 { component = 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 } var components = make(map[string]string) if (component & 1) == 1 { components["scheme"] = u.Scheme } if (component & 2) == 2 { components["host"] = u.Hostname() } if (component & 4) == 4 { components["port"] = u.Port() } if (component & 8) == 8 { components["user"] = u.User.Username() } if (component & 16) == 16 { components["pass"], _ = u.User.Password() } if (component & 32) == 32 { components["path"] = u.Path } if (component & 64) == 64 { components["query"] = u.RawQuery } if (component & 128) == 128 { components["fragment"] = u.Fragment } return components, nil } //URL编码 func (l *Url) URLEncode() string { return url.QueryEscape(l.str) } //URL编码还原 func (l *Url) URLDecode() (string, error) { return url.QueryUnescape(l.str) } //按照 RFC 3986 对 URL 进行编码 func (l *Url) Rawurlencode() string { return strings.Replace(url.QueryEscape(l.str), "+", "%20", -1) } //对已编码的 URL 字符串进行解码 func (l *Url) Rawurldecode() (string, error) { return url.QueryUnescape(strings.Replace(l.str, "%20", "+", -1)) } //生成 URL-encode 之后的请求字符串 /*func (l *Url) HTTPBuildQuery(queryData url.Values) string { return queryData.Encode() }*/ //Base64编码 func (l *Url) Base64Encode() string { return base64.StdEncoding.EncodeToString([]byte(l.str)) } //Base64编码还原 func (l *Url) Base64Decode() (string, error) { str := l.str switch len(str) % 4 { case 2: str += "==" case 3: str += "=" } data, err := base64.StdEncoding.DecodeString(str) if err != nil { return "", err } return NewRaw(data).ToStr(), nil }