gitee.com/h79/goutils@v1.22.10/common/http/url.go (about) 1 package http 2 3 import ( 4 "gitee.com/h79/goutils/common/stringutil" 5 "gitee.com/h79/goutils/common/tag" 6 "net/url" 7 "reflect" 8 "strings" 9 ) 10 11 const URLTagName = "url" 12 13 type Url struct { 14 url.Values 15 } 16 17 func NewUrl() Url { 18 return Url{Values: url.Values{}} 19 } 20 21 func WithParams(data interface{}) Url { 22 u := Url{Values: url.Values{}} 23 u.Parse(data) 24 return u 25 } 26 27 func (u Url) Parse(data interface{}) { 28 value := tag.StructVal(data) 29 30 switch value.Kind() { 31 case reflect.Map: 32 u.parseMap(value) 33 34 case reflect.Struct: 35 u.parseStruct(value) 36 37 default: 38 panic("no support") 39 } 40 } 41 42 func (u Url) parseMap(value reflect.Value) { 43 iter := value.MapRange() 44 for iter.Next() { 45 u.Add(iter.Key().String(), stringutil.ToStringV2(iter.Value())) 46 } 47 } 48 49 func (u Url) parseStruct(value reflect.Value) { 50 fields := tag.StructFields(value, URLTagName) 51 for _, field := range fields { 52 name := field.Name 53 val := value.FieldByName(name) 54 tagName, tagOpts := tag.Parse(field.Tag.Get(URLTagName)) 55 if tagName != "" { 56 name = tagName 57 } 58 emp := tagOpts.Has("omitempty") 59 if emp && val.IsZero() { 60 continue 61 } 62 u.Add(name, stringutil.ToStringV2(val)) 63 } 64 } 65 66 func (u Url) Generate(url, suffix string) string { 67 if !strings.HasSuffix(url, suffix) { 68 url += suffix 69 } 70 return url + u.Encode() 71 } 72 73 func ConvertTo(data interface{}) url.Values { 74 u := Url{Values: url.Values{}} 75 u.Parse(data) 76 return u.Values 77 } 78 79 func URLWithPath(rawUrl string, path string, params map[string]interface{}) (u *url.URL) { 80 u, err := url.Parse(rawUrl) 81 if err != nil { 82 return 83 } 84 if len(path) > 0 { 85 u, err = u.Parse(path) 86 if err != nil { 87 return 88 } 89 } 90 ul := NewUrl() 91 ul.Parse(params) 92 u.RawQuery = ul.Encode() 93 return 94 } 95 96 func URLWithParams(rawUrl string, params map[string]interface{}) (u *url.URL) { 97 return URLWithPath(rawUrl, "", params) 98 }