| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- 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
- }
|