Go标准库中的net/url
qingheluo2024-12-26清河洛184
url包解析URL并实现查询转义包级函数
JoinPath(base string, elem ...string) (result string, err error)
解析所有参数并返回连接后的url字符串
结果中会清除任何"./" 或 "../" 元素
PathEscape(s string) string
编码一个字符串以使其可以作为一个路径字符串安全的放置在url中
将特殊字符(包括/)替换为%XX序列
PathUnescape(s string) (string, error)
解码一个路径字符串
QueryEscape(s st...
url包解析URL并实现查询转义
包级函数
JoinPath(base string, elem ...string) (result string, err error) 解析所有参数并返回连接后的url字符串 结果中会清除任何"./" 或 "../" 元素 PathEscape(s string) string 编码一个字符串以使其可以作为一个路径字符串安全的放置在url中 将特殊字符(包括/)替换为%XX序列 PathUnescape(s string) (string, error) 解码一个路径字符串 QueryEscape(s string) string 编码一个字符串以使其可以安全的放置于查询中 QueryUnescape(s string) (string, error) 解码一个查询字符串
type URL
一个url的基本格式为
常规URL: scheme://[username:password@]host/path[?query][#fragment] 非常规URL: scheme:opaque[?query][#fragment]
当host为一个IPv6地址时,必须使用中括号包含,如"[fe80::1]:541"
type URL struct { Scheme string Opaque string User *Userinfo Host string Path string RawPath string OmitHost bool ForceQuery bool RawQuery string Fragment string RawFragment string Path和Fragment字段中如果存在%AB格式会进行解码,并将未解码的原始值存入RawPath和RawFragment字段 Path和Fragment字段中如果不存在%AB格式,RawPath和RawFragment字段为空字符串 Opaque 表示非标准URL的不透明部分 当URL的路径部分无法被标准解析时,Opaque字段会被用来存储这部分信息 主要用于处理一些特殊URL,如 mailto:[email protected] data:text/plain;base64,SGVsbG8sIFdvcmxkIQ== 这些URL中没有明确的主机或路径结构,只有scheme和不透明的内容 OmitHost 表示是否省略URL中的主机部分,默认false 为true时即使设置了Host字段在序列化为字符串时主机部分也会被省略 主要用于处理本地文件路径等不需要主机部分的URL,如 file:///path/to/file ForceQuery 表示查询字符串为空时RawQuery字段是否设为"?",默认为false,RawQuery字段为空字符串
创建URL
Parse(rawURL string) (*URL, error) 解析一个url并返回URL ParseRequestURI(rawURL string) (*URL, error) 忽略Fragment部分解析一个url并返回URL 会假定要解析的url是在http请求中收到的 Fragment仅作为客户端定位资源使用,并不会通过请求传递
URL的常用方法
String() string 将URL组合为有效的url字符串 Redacted() string 类似于String() 但如果存在Userinfo且Userinfo中设有密码,会将密码替换为连续的5个x("xxxxxx") MarshalBinary() (text []byte, err error) 将String()方法返回的字符串转码为字节码 RequestURI() string 返回Path和RawQuery使用"?"连接组成的字符串 EscapedFragment() string 编码Fragment字段并返回 EscapedPath() string 编码Path字段并返回 Hostname() string 获取不含端口号的host,IPv6会去除中括号 Port() string 获取端口号的字符串 IsAbs() bool Scheme字段是否非空 JoinPath(elem ...string) *URL 在现有Path后添加参数中的路径 结果中会清除任何"./" 或 "../" 元素 任何包含多个 / 字符将缩减为单个 / Parse(ref string) (*URL, error) 将现有URL作为基路径解析ref ResolveReference(ref *URL) *URL 将现有URL作为基路径解析ref ref可以为绝对路径或相对路径 如果为绝对路径,会忽略现有URL解析ref Query() Values 解析RawQuery,它丢弃格式不正确的键值对
type Userinfo
Userinfo是URL的用户名和密码信息的不可变封装,所以其字段均为隐藏字段
创建Userinfo
User(username string) *Userinfo UserPassword(username, password string) *Userinfo
Userinfo的常用方法
Password() (string, bool) 返回已设置密码以及是否设置密码 Username() string String() string 以"username[:password]"的格式返回字符串
type Values
Values将字符串键映射到值列表,通常用于查询参数、表单值和http.Header映射中
type Values map[string][]string
ParseQuery(query string) (Values, error) 解析URL编码的查询字符串 始终返回一个非nil映射,其中包含找到的所有有效查询参数 err描述遇到的第一个解码错误
Values的常用方法
Add(key, value string) 将key键的值中追加值 Del(key string) Set(key, value string) 将key键的值清空后设置为新值 Get(key string) string 获取指定key键的值的第一个值,未找到key返回空字符串 Has(key string) bool Encode() string 按键排序后编码为url查询格式(key1=val1&key2=val2)