Files
2026-07-14 10:24:10 +08:00

84 lines
1.7 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package utils
import (
"net/url"
)
// URLBuilder URL 构建器
type URLBuilder struct {
u *url.URL
query url.Values
}
// ParseURL 解析 URL 字符串
func ParseURL(rawURL string) (*URLBuilder, error) {
u, err := url.Parse(rawURL)
if err != nil {
return nil, err
}
return &URLBuilder{
u: u,
query: u.Query(),
}, nil
}
// AddQuery 添加单个查询参数
func (b *URLBuilder) AddQuery(key, value string) *URLBuilder {
b.query.Add(key, value)
return b
}
// AddQueries 批量添加查询参数(追加,同 key 多值共存,M2 修复:原实现用 Set 会覆盖)。
// params 为 nil 时无操作(遍历 nil map 安全,不 panic)。
func (b *URLBuilder) AddQueries(params map[string]string) *URLBuilder {
for k, v := range params {
b.query.Add(k, v)
}
return b
}
// SetQuery 设置查询参数(覆盖同名参数)
func (b *URLBuilder) SetQuery(key, value string) *URLBuilder {
b.query.Set(key, value)
return b
}
// SetPath 设置路径
func (b *URLBuilder) SetPath(path string) *URLBuilder {
b.u.Path = path
return b
}
// SetScheme 设置协议(http/https
func (b *URLBuilder) SetScheme(scheme string) *URLBuilder {
b.u.Scheme = scheme
return b
}
// SetHost 设置主机
func (b *URLBuilder) SetHost(host string) *URLBuilder {
b.u.Host = host
return b
}
// Build 构建最终的 URL
func (b *URLBuilder) Build() *url.URL {
b.u.RawQuery = b.query.Encode()
return b.u
}
// String 返回 URL 字符串
func (b *URLBuilder) String() string {
return b.Build().String()
}
// URLEncode URL 编码
func URLEncode(s string) string {
return url.QueryEscape(s)
}
// URLDecode URL 解码
func URLDecode(s string) (string, error) {
return url.QueryUnescape(s)
}