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  }