Go学习笔记(50)—Go标准库之neturl(查询转义、查询参数增删改查、解析...

Go学习笔记(50)—Go标准库之neturl(查询转义、查询参数增删改查、解析...

2023年6月25日发(作者:)

Go学习笔记(50)—Go标准库之neturl(查询转义、查询参数增删改查、解析URL)1. URL 概述import "net/url"url 包解析

URL 并实现了查询的转码。URL 提供了⼀种定位因特⽹上任意资源的⼿段,但这些资源是可以通过各种不同的⽅案(⽐如HTTP 、

FTP 、

SMTP )来访问,因此

URL 语法会随着⽅案的不同⽽不同。完整的

URL 格式为:://:@:/:?#各部分字段说明:scheme : ⽅案是如何访问指定资源的主要标识符,他会告诉负责解析

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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信