url.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package helper
  2. import (
  3. "encoding/base64"
  4. "net/url"
  5. "strings"
  6. )
  7. type Url struct {
  8. str string
  9. }
  10. func NewUrl(str string) *Url {
  11. return &Url{str}
  12. }
  13. //解析 URL
  14. // -1: all; 1: scheme; 2: host; 4: port; 8: user; 16: pass; 32: path; 64: query; 128: fragment
  15. func (l *Url) ParseURL(component int) (map[string]string, error) {
  16. u, err := url.Parse(l.str)
  17. if err != nil {
  18. return nil, err
  19. }
  20. if component == -1 {
  21. component = 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128
  22. }
  23. var components = make(map[string]string)
  24. if (component & 1) == 1 {
  25. components["scheme"] = u.Scheme
  26. }
  27. if (component & 2) == 2 {
  28. components["host"] = u.Hostname()
  29. }
  30. if (component & 4) == 4 {
  31. components["port"] = u.Port()
  32. }
  33. if (component & 8) == 8 {
  34. components["user"] = u.User.Username()
  35. }
  36. if (component & 16) == 16 {
  37. components["pass"], _ = u.User.Password()
  38. }
  39. if (component & 32) == 32 {
  40. components["path"] = u.Path
  41. }
  42. if (component & 64) == 64 {
  43. components["query"] = u.RawQuery
  44. }
  45. if (component & 128) == 128 {
  46. components["fragment"] = u.Fragment
  47. }
  48. return components, nil
  49. }
  50. //URL编码
  51. func (l *Url) URLEncode() string {
  52. return url.QueryEscape(l.str)
  53. }
  54. //URL编码还原
  55. func (l *Url) URLDecode() (string, error) {
  56. return url.QueryUnescape(l.str)
  57. }
  58. //按照 RFC 3986 对 URL 进行编码
  59. func (l *Url) Rawurlencode() string {
  60. return strings.Replace(url.QueryEscape(l.str), "+", "%20", -1)
  61. }
  62. //对已编码的 URL 字符串进行解码
  63. func (l *Url) Rawurldecode() (string, error) {
  64. return url.QueryUnescape(strings.Replace(l.str, "%20", "+", -1))
  65. }
  66. //生成 URL-encode 之后的请求字符串
  67. /*func (l *Url) HTTPBuildQuery(queryData url.Values) string {
  68. return queryData.Encode()
  69. }*/
  70. //Base64编码
  71. func (l *Url) Base64Encode() string {
  72. return base64.StdEncoding.EncodeToString([]byte(l.str))
  73. }
  74. //Base64编码还原
  75. func (l *Url) Base64Decode() (string, error) {
  76. str := l.str
  77. switch len(str) % 4 {
  78. case 2:
  79. str += "=="
  80. case 3:
  81. str += "="
  82. }
  83. data, err := base64.StdEncoding.DecodeString(str)
  84. if err != nil {
  85. return "", err
  86. }
  87. return NewRaw(data).ToStr(), nil
  88. }