2023年6月25日发(作者:)
Go学习笔记(50)—Go标准库之neturl(查询转义、查询参数增删改查、解析URL)1. URL 概述import "net/url"url 包解析
URL 并实现了查询的转码。URL 提供了⼀种定位因特⽹上任意资源的⼿段,但这些资源是可以通过各种不同的⽅案(⽐如HTTP 、
FTP 、
SMTP )来访问,因此
URL 语法会随着⽅案的不同⽽不同。完整的
URL 格式为:
URL 应⽤程序应该使⽤什么协议;user :⽤户名;password :密码;host : 主机组件标识了因特⽹上能够访问资源的宿主机器,可以有主机名或者是
IP 地址来表⽰;port : 端⼝标识了服务器正在监听的⽹络端⼝。默认端⼝号是 80;path :
URL 的路径组件说明了资源位于服务器的什么地⽅;params :
URL 中通过协议参数来访问资源,⽐名值对列表,分号分割来进⾏访问;query : 字符串是通过提问问题或进⾏查询来缩⼩请求资源类的范围;frag : 为了引⽤部分资源或资源的⼀个⽚段,⽐如
URL 指定
HTML ⽂档中⼀个图⽚或⼀个⼩节;HTTP 通常只处理整个对象,⽽不是对象的⽚段,客户端不能将⽚段传送给服务器。浏览器从服务器获取整个资源之后,会根据⽚段来显⽰你感兴趣的⽚段部分。2. 主要类型和函数2.1 type URLGo 中
URL 结构体如下:type URL struct { Scheme string //具体指访问服务器上的资源使⽤的哪种协议 Opaque string //
编码后的不透明数据 User *Userinfo //
⽤户名和密码信息,有些协议需要传⼊明⽂⽤户名和密码来获取资源,⽐如 FTP Host string // host或host:port,服务器地址,可以是 IP
地址,也可以是域名信息 Path string //路径,使⽤"/"分隔 RawPath string //
已编码的路径提⽰(参见EscapedPath⽅法) ForceQuery bool //
添加⼀个查询('?'),即使RawQuery为空 RawQuery string //
编码后的查询字符串,没有'?' Fragment string //
引⽤的⽚段(⽂档位置),没有'#'}⽰例代码:func main() { urlString := "admin:passwd@:80/search?mq=test#12345" u, err := (urlString) if err != nil { n("parse error ", err) } ("u type is %T, u is %#vn", u, u) /* u type is *, u is &{ Scheme:"https", Opaque:"", User:(*fo)(0xc000088150), Host:":80", Path:"/search", RawPath:"", ForceQuery:false, RawQuery:"mq=test", Fragment:"12345" } */ (" is %#vn", ) // is "https" (" is %#vn", ) // is "" (" is %#vn", ) // is &fo{username:"admin", password:"passwd", passwordSet:true} (" is %#vn", ) // is ":80" (" is %#vn", ) // is "/search" ("h is %#vn", h) // h is "" ("uery is %#vn", uery) // uery is false ("ry is %#vn", ry) // ry is "mq=test" ("nt is %#vn", nt) // nt is "12345"}2.1.1 func Parsefunc Parse(rawurl string) (url *URL, err error)Parse 函数解析rawurl为⼀个URL结构体,rawurl` 可以是绝对地址,也可以是相对地址。2.1.2 func ParseRequestURIfunc ParseRequestURI(rawurl string) (url *URL, err error)ParseRequestURI 函数解析
rawurl 为⼀个
URL 结构体,本函数会假设
rawurl 是在⼀个
HTTP 请求⾥,因此会假设该参数是⼀个绝对URL 或者绝对路径,并会假设该
URL 没有
#fragment 后缀。(⽹页浏览器会在去掉该后缀后才将⽹址发送到⽹页服务器)func main() { urlString := "admin:passwd@:80/search?mq=test#12345" u, err := equestURI(urlString) if err != nil { n("parse error ", err) } ("nt is %#vn", nt) // nt is ""}2.1.3 func (*URL) IsAbsfunc (u *URL) IsAbs() bool函数在
URL 是绝对
URL 时才返回真。2.1.4 func (*URL) Queryfunc (u *URL) Query() ValuesQuery ⽅法解析
RawQuery 字段并返回其表⽰的
Values 类型键值对。2.1.5 func (*URL) RequestURIfunc (u *URL) RequestURI() stringRequestURI ⽅法返回编码好的
path?query 或
opaque?query 字符串,⽤在
HTTP 请求⾥。2.1.6 func (*URL) Stringfunc (u *URL) String() stringString 将
URL 重构为⼀个合法
URL 字符串。2.1.7 func (*URL) Parsefunc (u *URL) Parse(ref string) (*URL, error)Parse ⽅法以
u 为上下⽂来解析⼀个
URL ,
ref 可以是绝对或相对
URL 。本⽅法解析失败会返回
nil ,
err ;否则返回结果和ResolveReference ⼀致。func main() { u, _ := ("/dir/") n(u) // /dir/ result, _ := ("./search?mq=rabbitmq") n(result) // /dir/search?mq=rabbitmq}2.1.8 func (*URL) ResolveReferencefunc (u *URL) ResolveReference(ref *URL) *URL本⽅法根据⼀个绝对
URI 将⼀个
URI 补全为⼀个绝对
URI 。参数
ref 可以是绝对
URI 或者相对
URI 。
ResolveReference 总是返回⼀个新的
URL 实例,即使该实例和
u 或者
ref 完全⼀样。如果
ref 是绝对
URI ,本⽅法会忽略参照
URI 并返回
ref 的⼀个拷贝。2.1.9 代码⽰例func main() { urlString := "/search?mq=rabbitmq&queue=people#12345" u, err := (urlString) if err != nil { n("parse error ", err) } (" is %#vn", ()) // is true (" is %#vn", ()) // is {"mq":[]string{"rabbitmq"}, "queue":[]string{"people"}} ("tURI is %#vn", tURI()) // tURI is "/search?mq=rabbitmq&queue=people" (" is %#vn", ()) // is "/search?mq=rabbitmq&queue=people#12345"}2.2 type Valuestype Values map[string][]stringValues 将建映射到值的列表。它⼀般⽤于查询的参数和表单的属性。不同于
这个字典类型,
Values 的键是⼤⼩写敏感的。2.2.1 func ParseQueryfunc ParseQuery(query string) (m Values, err error)ParseQuery 函数解析⼀个
URL 编码的查询字符串,并返回可以表⽰该查询的
Values 类型的字典。本函数总是返回⼀个包含了所有合法查询参数的⾮
nil 字典,
err ⽤来描述解码时遇到的(如果有)第⼀个错误。代码⽰例:func main() { rawUrl := "mq=rabbitmq&queue=people" v, err := uery(rawUrl) if err != nil { n("ParseQuery error ", err) } ("v type is %T, v is %#vn", v, v) // v type is , v is {"mq":[]string{"rabbitmq"}, "queue":[]string{"people"}} //
等价于下⾯的⽅法 urlString := "/search?mq=rabbitmq&queue=people#12345" u, _ := (urlString) queryV := () ("queryV type is %T, queryV is %#vn", queryV, queryV) // queryV type is , queryV is {"mq":[]string{"rabbitmq"}, "queue":[]string{"people"}}}2.2.2 func (Values) Getfunc (v Values) Get(key string) stringGet 会获取
key 对应的值集的第⼀个值。如果没有对应
key 的值集会返回空字符串。获取值集请直接⽤
map 。2.2.3 func (Values) Setfunc (v Values) Set(key, value string)Set ⽅法将
key 对应的值集设为只有
value ,它会替换掉已有的值集。2.2.4 func (Values) Addfunc (v Values) Add(key, value string)Add 将
value 添加到
key 关联的值集⾥原有的值的后⾯。2.2.5 func (Values) Delfunc (v Values) Del(key string)Del 删除
key 关联的值集。2.2.6 func (Values) Encodefunc (v Values) Encode() stringEncode ⽅法将
v 编码为
ur 编码格式(“bar=baz&foo=quux”),编码时会以键进⾏排序。2.2.7 代码⽰例func main() { rawUrl := "mq=rabbitmq&queue=people" v, err := uery(rawUrl) if err != nil { n("ParseQuery error ", err) } ("v type is %T, v is %#vn", v, v) // v type is , v is {"mq":[]string{"rabbitmq"}, "queue":[]string{"people"}} n(("mq")) // rabbitmq ("mq", "redis") n(("mq")) // redis ("name", "wohu") ("v is %#vn", v) // v is {"mq":[]string{"redis"}, "name":[]string{"wohu"}, "queue":[]string{"people"}} (" is %#vn", ()) // is "mq=redis&name=wohu&queue=people" ("name") ("v is %#vn", v) // v is {"mq":[]string{"redis"}, "queue":[]string{"people"}}}package main import ( "fmt" "net/url"
) func main() { v := {} //公共参数 ("Name", "wohu") ("Age", "18") n( v ) }2.3 查询转义2.3.1 func QueryEscapefunc QueryEscape(s string) stringQueryEscape 函数对
s 进⾏转码使之可以安全的⽤在
URL 查询⾥。2.3.2 func QueryUnescapefunc QueryUnescape(s string) (string, error)QueryUnescape 函数⽤于将
QueryEscape 转码的字符串还原。它会把
%AB 改为字节
0xAB ,将
+ 改为空格 。如果有某个
% 后⾯未跟两个⼗六进制数字,本函数会返回错误。2.3.3 代码⽰例func main() { rawUrl := "mq=rabbitmq&queue=people" stdUrl := scape(rawUrl) ("stdUrl is %vn", stdUrl) // stdUrl is mq%3Drabbitmq%26queue%3Dpeople rawurl, _ := nescape(stdUrl) ("rawurl is %vn", rawurl) // rawurl is mq=rabbitmq&queue=people}
发布者:admin,转转请注明出处:http://www.yc00.com/news/1687679715a30966.html
评论列表(0条)