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, },