注册 登录

清河洛

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  :是否含有给定的键


网址导航