注册 登录

清河洛

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)


网址导航