Go中的url解析
qingheluo2024-08-05清河洛194
Go中的"net/url"实现了url的解析相关功能包函数
QueryEscape(s string) string :对s进行转码使之可以安全的用在URL查询里
url:"https://domain.com/s?wd=中+文"转化后为
"https%3A%2F%2Fdomain.com%2Fs%3Fwd%3D%E4%B8%AD%2B%E6%96%87"
QueryUnescape(s string) (string, error) :将QueryEscape转码的字符串还原
会把%AB转换为字符串"\xab","+"转换为" "
JoinPath(ba...
Go中的"net/url"实现了url的解析相关功能
包函数
QueryEscape(s string) string :对s进行转码使之可以安全的用在URL查询里 url:"https://domain.com/s?wd=中+文"转化后为 "https%3A%2F%2Fdomain.com%2Fs%3Fwd%3D%E4%B8%AD%2B%E6%96%87" QueryUnescape(s string) (string, error) :将QueryEscape转码的字符串还原 会把%AB转换为字符串"\xab","+"转换为" " JoinPath(base string, elem ...string) (result string, err error) 基于根目录base将后续的所有目录连接起来 elem可以包含"./"或"../"等特殊目录字符串 最终结果会清除其中出现的任何"./"或"../"等特殊目录字符串 PathEscape(s string) string :对s进行转码使之可以安全的用在URL查询里 不同于QueryEscape,仅转换路径中的特殊字符 不会转换s中的 :、&、=、# 等url中的特殊字符 PathUnescape(s string) (string, error) 功能和QueryUnescape相同,唯一不同的是 不会将"+"转化为" ",而是原封输出
type URL
type URL struct { Scheme string // 协议 Opaque string // 编码后的不透明数据 User *Userinfo // 用户名和密码信息 Host string // host或host:port // 当主机是IPv6时,需要使用中括号包含IP:"[fe80::1]:80" Path string // 解码后的RawPath RawPath string // 原始的Path值,仅当与Path不等时才会设置该字段 OmitHost bool // 主机为空时是否发送请求 ForceQuery bool // 构成url时始终附加"?"即使RawQuery为空 RawQuery string // "?"之后的查询字符串(不含"?"),原始的查询字符串 Fragment string // "#"之后的字符串(不含"#"),会将RawFragment进行解码 RawFragment string // 原始的Fragment值 } 一个完整的url一般构成为 scheme://[userinfo@]host/path[?query][#fragment] scheme后不是冒号加双斜线的URL被解释为如下格式 scheme:opaque[?query][#fragment]
创建URL
Parse(rawurl string) (url *URL, err error) 解析rawurl为一个URL结构体 rawurl可以是相对地址但必须以协议开头 ParseRequestURI(rawurl string) (url *URL, err error) 解析rawurl为一个URL结构体 会假设rawurl是在一个HTTP请求里,因此会假设该参数是一个绝对URL,并会假设没有#fragment
URL的方法
IsAbs() bool :是否是绝对地址,含有协议的URL为绝对地址 Query() Values :解析RawQuery字段并返回其表示的Values类型键值对,会自动丢弃格式错误的值对 RequestURI() string :返回用在HTTP请求的编码好的path?query或opaque?query字符串 Parse(ref string) (*URL, error) :以URL为根网址来解析一个URL ref可以是绝对路径时忽略URL根网址 返回结果和ResolveReference一致 ResolveReference(ref *URL) *URL 根据一个URL根网址将一个URL补全为一个绝对路径 如果ref是绝对路径,会忽略根网址并返回ref的一个拷贝 函数总是返回一个新的URL实例,即使返回实例和跟网址或ref完全一样 EscapedFragment() string :返回Fragment字段的转义形式 当可以有效转义Fragment时返回RawFragment,否则将忽略RawFragment并自行转义后返回 String方法使用EscapedFragment构造其结果 通常应调用EscapedFragment,而不是直接获取RawFragment Hostname() string :不含端口号的主机名 Port() string :返回字面量的端口号,如果Host不含端口(默认值)返回空字符串 JoinPath(elem ...string) *URL 基于URL根目录将所有目录连接起来 elem可以包含"./"或"../"等特殊目录字符串 最终结果会清除其中出现的任何"./"或"../"等特殊目录字符串 String() string :将URL解析为有效的用于http访问的字符串 MarshalBinary() (text []byte, err error) :获取String()返回值的字节切片 Redacted() string :获取String()返回值的User中密码使用“xxxxx”替换的字符串 RequestURI() string :获取可用于HTTP请求的查询字符串
type Userinfo
表示一个URL的用户名和密码。一个合理的Userinfo值必须保证有用户名以及一个可选的密码
创建Userinfo
User(username string) *Userinfo :创建一个设置用户名但不设置密码的*Userinfo UserPassword(username, password string) *Userinfo :创建一个设置用户名和密码的*Userinfo
Userinfo的方法
Username() string :获取用户名 Password() (string, bool) :获取密码及是否设置了密码 String() string :获取编码后的用户信息,格式为"username[:password]"
type Values
表示查询参数和表单数据解析后的映射值
Values的键是大小写敏感的,这不同于http.Header的不区分大小写
type Values map[string][]string ParseQuery(query string) (m Values, err error) 解析一个URL编码的查询字符串并返回可以表示该查询的Values类型的字典 err用来描述解码时遇到的(如果有)第一个错误
Values的方法
Get(key string) string :获取key对应的值集的第一个值 Set(key, value string) :将key对应的值集设为只有value,会替换掉已有的值集 Add(key, value string) :将value添加到key关联的值集里原有的值的后面 Del(key string) :删除key关联的值集 Encode() string :将Values编码为url编码格式("bar=baz&foo=quux"),编码时会以键进行排序 Has(key string) bool :是否含有给定的键