diff --git a/docs/api/packages/netutil.md b/docs/api/packages/netutil.md
index 7fa895e..60d2067 100644
--- a/docs/api/packages/netutil.md
+++ b/docs/api/packages/netutil.md
@@ -48,6 +48,9 @@ import (
- [UploadFile](#UploadFile)
- [IsPingConnected](#IsPingConnected)
- [IsTelnetConnected](#IsTelnetConnected)
+- [IsTelnetConnected](#IsTelnetConnected)
+- [BuildUrl](#BuildUrl)
+- [AddQueryParams](#AddQueryParams)
@@ -1031,3 +1034,83 @@ func main() {
// false
}
```
+
+### BuildUrl
+
+创建url字符串。
+
+函数签名:
+
+```go
+func BuildUrl(scheme, host, path string, query map[string][]string) (string, error)
+```
+
+示例:[运行](todo)
+
+```go
+package main
+
+import (
+ "fmt"
+ "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+ urlStr, err := netutil.BuildUrl(
+ "https",
+ "example.com",
+ "query",
+ map[string][]string{
+ "a": {"foo", "bar"},
+ "b": {"baz"},
+ },
+ )
+
+ fmt.Println(urlStr)
+ fmt.Println(err)
+
+ // Output:
+ // https://example.com/query?a=foo&a=bar&b=baz
+ //
+}
+```
+
+### AddQueryParams
+
+向url添加查询参数。
+
+函数签名:
+
+```go
+func AddQueryParams(urlStr string, params map[string][]string) (string, error)
+```
+
+示例:[运行](todo)
+
+```go
+package main
+
+import (
+ "fmt"
+ "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+ urlStr, err := netutil.BuildUrl(
+ "https",
+ "example.com",
+ "query",
+ map[string][]string{
+ "a": {"foo", "bar"},
+ "b": {"baz"},
+ },
+ )
+
+ fmt.Println(urlStr)
+ fmt.Println(err)
+
+ // Output:
+ // https://example.com/query?a=foo&a=bar&b=baz
+ //
+}
+```
\ No newline at end of file
diff --git a/docs/en/api/packages/netutil.md b/docs/en/api/packages/netutil.md
index 6f68af7..f653dd5 100644
--- a/docs/en/api/packages/netutil.md
+++ b/docs/en/api/packages/netutil.md
@@ -48,6 +48,9 @@ import (
- [UploadFile](#UploadFile)
- [IsPingConnected](#IsPingConnected)
- [IsTelnetConnected](#IsTelnetConnected)
+- [BuildUrl](#BuildUrl)
+- [AddQueryParams](#AddQueryParams)
+
@@ -1031,3 +1034,83 @@ func main() {
// false
}
```
+
+### BuildUrl
+
+Builds a URL from the given params.
+
+Signature:
+
+```go
+func BuildUrl(scheme, host, path string, query map[string][]string) (string, error)
+```
+
+Example:[Run](todo)
+
+```go
+package main
+
+import (
+ "fmt"
+ "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+ urlStr, err := netutil.BuildUrl(
+ "https",
+ "example.com",
+ "query",
+ map[string][]string{
+ "a": {"foo", "bar"},
+ "b": {"baz"},
+ },
+ )
+
+ fmt.Println(urlStr)
+ fmt.Println(err)
+
+ // Output:
+ // https://example.com/query?a=foo&a=bar&b=baz
+ //
+}
+```
+
+### AddQueryParams
+
+Adds query parameters to the given URL.
+
+Signature:
+
+```go
+func AddQueryParams(urlStr string, params map[string][]string) (string, error)
+```
+
+Example:[Run](todo)
+
+```go
+package main
+
+import (
+ "fmt"
+ "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+ urlStr, err := netutil.BuildUrl(
+ "https",
+ "example.com",
+ "query",
+ map[string][]string{
+ "a": {"foo", "bar"},
+ "b": {"baz"},
+ },
+ )
+
+ fmt.Println(urlStr)
+ fmt.Println(err)
+
+ // Output:
+ // https://example.com/query?a=foo&a=bar&b=baz
+ //
+}
+```
\ No newline at end of file
diff --git a/netutil/net.go b/netutil/net.go
index e0b498b..33847df 100644
--- a/netutil/net.go
+++ b/netutil/net.go
@@ -310,7 +310,7 @@ func IsTelnetConnected(host string, port string) bool {
// BuildUrl builds a URL from the given params.
// Play: todo
-func BuildUrl(scheme, host, path string, query map[string]string) (string, error) {
+func BuildUrl(scheme, host, path string, query map[string][]string) (string, error) {
if err := validateScheme(scheme); err != nil {
return "", err
}
@@ -329,15 +329,17 @@ func BuildUrl(scheme, host, path string, query map[string]string) (string, error
if path == "" {
parsedUrl.Path = "/"
} else if !strings.HasPrefix(path, "/") {
- path = "/" + path
+ parsedUrl.Path = "/" + path
} else {
parsedUrl.Path = path
}
queryParams := parsedUrl.Query()
- for key, value := range query {
- queryParams.Add(key, value)
+ for key, values := range query {
+ for _, value := range values {
+ queryParams.Add(key, value)
+ }
}
parsedUrl.RawQuery = queryParams.Encode()
@@ -370,14 +372,15 @@ var alphaNumericRegex = regexp.MustCompile(`^[a-zA-Z0-9]+$`)
// AddQueryParams adds query parameters to the given URL.
// Play: todoå
-func AddQueryParams(urlStr string, params map[string]string) (string, error) {
+func AddQueryParams(urlStr string, params map[string][]string) (string, error) {
parsedUrl, err := url.Parse(urlStr)
if err != nil {
return "", err
}
queryParams := parsedUrl.Query()
- for k, v := range params {
+
+ for k, values := range params {
if k == "" {
return "", errors.New("empty key is not allowed")
}
@@ -386,11 +389,12 @@ func AddQueryParams(urlStr string, params map[string]string) (string, error) {
return "", fmt.Errorf("query parameter key %s must be alphanumeric", k)
}
- if !alphaNumericRegex.MatchString(v) {
- return "", fmt.Errorf("query parameter value %s must be alphanumeric", v)
+ for _, v := range values {
+ if !alphaNumericRegex.MatchString(v) {
+ return "", fmt.Errorf("query parameter value %s must be alphanumeric", v)
+ }
+ queryParams.Add(k, v)
}
-
- queryParams.Add(k, v)
}
parsedUrl.RawQuery = queryParams.Encode()
diff --git a/netutil/net_example_test.go b/netutil/net_example_test.go
index 743ca0f..cd56a0d 100644
--- a/netutil/net_example_test.go
+++ b/netutil/net_example_test.go
@@ -201,3 +201,40 @@ func ExampleIsTelnetConnected() {
// true
// false
}
+
+func ExampleBuildUrl() {
+ urlStr, err := BuildUrl(
+ "https",
+ "example.com",
+ "query",
+ map[string][]string{
+ "a": {"foo", "bar"},
+ "b": {"baz"},
+ },
+ )
+
+ fmt.Println(urlStr)
+ fmt.Println(err)
+
+ // Output:
+ // https://example.com/query?a=foo&a=bar&b=baz
+ //
+}
+
+func ExampleAddQueryParams() {
+ urlStr := "https://example.com"
+
+ params := map[string][]string{
+ "a": {"foo", "bar"},
+ "b": {"baz"},
+ }
+
+ urlStr, err := AddQueryParams(urlStr, params)
+
+ fmt.Println(urlStr)
+ fmt.Println(err)
+
+ // Output:
+ // https://example.com?a=foo&a=bar&b=baz
+ //
+}
diff --git a/netutil/net_test.go b/netutil/net_test.go
index 7401337..9b89e85 100644
--- a/netutil/net_test.go
+++ b/netutil/net_test.go
@@ -152,7 +152,7 @@ func TestBuildUrl(t *testing.T) {
scheme string
host string
path string
- query map[string]string
+ query map[string][]string
want string
wantErr bool
}{
@@ -160,7 +160,7 @@ func TestBuildUrl(t *testing.T) {
scheme: "http",
host: "www.test.com",
path: "/path/subpath",
- query: map[string]string{"a": "1", "b": "2"},
+ query: map[string][]string{"a": {"1"}, "b": {"2"}},
want: "http://www.test.com/path/subpath?a=1&b=2",
wantErr: false,
},
@@ -168,10 +168,18 @@ func TestBuildUrl(t *testing.T) {
scheme: "http",
host: "www.test.com",
path: "/simple-path",
- query: map[string]string{"a": "1", "b": "2"},
+ query: map[string][]string{"a": {"1"}, "b": {"2"}},
want: "http://www.test.com/simple-path?a=1&b=2",
wantErr: false,
},
+ {
+ scheme: "http",
+ host: "www.test.com",
+ path: "",
+ query: map[string][]string{"a": {"foo", "bar"}, "b": {"baz"}},
+ want: "http://www.test.com/?a=foo&a=bar&b=baz",
+ wantErr: false,
+ },
{
scheme: "https",
host: "www.test. com",
@@ -205,25 +213,31 @@ func TestAddQueryParams(t *testing.T) {
tests := []struct {
url string
- query map[string]string
+ query map[string][]string
want string
wantErr bool
}{
{
url: "http://www.test.com",
- query: map[string]string{"a": "1", "b": "2"},
+ query: map[string][]string{"a": {"1"}, "b": {"2"}},
want: "http://www.test.com?a=1&b=2",
wantErr: false,
},
{
url: "http://www.test.com",
- query: map[string]string{},
+ query: map[string][]string{"a": {"foo", "bar"}, "b": {"baz"}},
+ want: "http://www.test.com?a=foo&a=bar&b=baz",
+ wantErr: false,
+ },
+ {
+ url: "http://www.test.com",
+ query: map[string][]string{},
want: "http://www.test.com",
wantErr: false,
},
{
url: "http://www.test.com",
- query: map[string]string{"a": "$%"},
+ query: map[string][]string{"a": {"$%"}},
want: "",
wantErr: true,
},