-
Notifications
You must be signed in to change notification settings - Fork 3
/
query.go
executable file
·116 lines (103 loc) · 2.67 KB
/
query.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package urlKit
import (
"net/url"
)
// ParseQuery
/*
e.g.
u, err := urlKit.Verify("http://localhost:8080/go?a=123&b=456")
if err != nil {
panic(err)
}
fmt.Println(u.RawQuery) // a=123&b=456
m, err := urlKit.ParseQuery(u.RawQuery)
if err != nil {
panic(err)
}
fmt.Println(m) // map[a:[123] b:[456]]
*/
var ParseQuery func(query string) (url.Values, error) = url.ParseQuery
// ToEscapedQueryString
/*
@return 处理过的query string(可直接放到url中)
*/
func ToEscapedQueryString[T ~map[string][]string](m T) string {
var values = url.Values(m)
return values.Encode()
}
// AddQueryParamsToValues
/*
@param queryParams 切片中的字符串应当是未处理(编码)过的
@return 必定不为nil
*/
func AddQueryParamsToValues(values url.Values, queryParams map[string][]string) url.Values {
if values == nil {
values = make(map[string][]string)
}
for k, s := range queryParams {
for _, v := range s {
values.Add(k, v)
}
}
return values
}
// OverrideRawQuery 覆盖请求的query.
/*
PS: 可能会修改 req.URL.RawQuery.
*/
func OverrideRawQuery(u *url.URL, queryParams map[string][]string) {
values := AddQueryParamsToValues(nil, queryParams)
u.RawQuery = values.Encode()
}
// AddToRawQuery 增添请求的query.
/*
PS: 可能会修改 req.URL.RawQuery.
@param queryParams 切片中的字符串应当是未处理(编码)过的
*/
func AddToRawQuery(u *url.URL, queryParams map[string][]string) {
values := u.Query()
values = AddQueryParamsToValues(values, queryParams)
u.RawQuery = values.Encode()
}
func AddQueryParamsToUrl(rawURL string, queryParams map[string][]string) (string, error) {
u, err := ParseRequestURI(rawURL)
if err != nil {
return "", err
}
/*
!!!: 不要只使用 URL.String() ,原因: 该方法内部直接使用了 RawQuery 属性(满足条件的话),导致如果 RawQuery 中包含未处理字符(比如中文),返回值中还是会包含未处理字符
TODO: 后续看官方是否会修改 URL.String() 中对query的处理.
*/
AddToRawQuery(u, queryParams)
return u.String(), nil
}
//// ToQueryString Deprecated: use url.Values instead.
///*
//@param m 会对值进行 编码 操作
//@return 可能为""
//
//e.g.
// (nil) => ""
//e.g.1
// m := map[string]string{
// "a": "test",
// "b": "测试",
// }
// fmt.Println(urlKit.ToQueryString(m)) // a=test&b=%E6%B5%8B%E8%AF%95
//*/
//func ToQueryString(queryParams map[string]string) string {
// var str string
//
// for k, v := range queryParams {
// // PS: k和v都有可能是""
// if strKit.IsNotEmpty(str) {
// str += "&"
// }
// if strKit.IsNotEmpty(v) {
// str += k + "=" + EncodeURIComponent(v)
// } else {
// str += k
// }
// }
// return str
//}