golang net.url標(biāo)準(zhǔn)庫(kù)的具體使用
Go 語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的 net/url 包提供了用于 URL 解析、構(gòu)建和查詢的功能。這個(gè)包使我們能夠處理 URL,從中提取出各個(gè)部分,比如協(xié)議、主機(jī)、路徑和查詢參數(shù)等。以下是 net/url 包中一些常用的功能:
- 解析URL:使用 Parse 函數(shù)可以將 URL 字符串解析為 url.URL 結(jié)構(gòu)體。
u, err := url.Parse("https://example.com/path?key1=value1&key2=value2")
if err != nil {
log.Fatal(err)
}
- 構(gòu)建URL:可以使用 url.URL 結(jié)構(gòu)體中的方法來(lái)構(gòu)建 URL。
u := &url.URL{
Scheme: "https",
Host: "example.com",
Path: "/path",
RawQuery: "key1=value1&key2=value2",
}
- 查詢參數(shù):url.Values 類型表示 URL 查詢參數(shù),可以用于構(gòu)建和解析查詢參數(shù)。
u, _ := url.Parse("https://example.com/path?key1=value1&key2=value2")
queryValues := u.Query()
fmt.Println(queryValues.Get("key1")) // 輸出: value1
fmt.Println(queryValues.Get("key2")) // 輸出: value2
其它功能:url.URL 結(jié)構(gòu)體中還提供了一些其他方法,比如獲取完整的 URL 字符串、處理路徑、解析主機(jī)等等。
基本類型結(jié)構(gòu)
<schema>://<user>:<password>@<host>:<port>/<path>:<params>?<query>#<frag>
參數(shù)描述:
| 名稱 | 描述 |
|---|---|
| scheme | 方案是如何訪問(wèn)指定資源的主要標(biāo)識(shí)符,他會(huì)告訴負(fù)責(zé)解析URL應(yīng)用程序應(yīng)該使用什么協(xié)議 |
| user | 用戶名 |
| password | 密碼 |
| host | 主機(jī)組件標(biāo)識(shí)了因特網(wǎng)上能夠訪問(wèn)資源的宿主機(jī)器,可以有主機(jī)名或者是 IP 地址來(lái)表示 |
| port | 端口標(biāo)識(shí)了服務(wù)器正在監(jiān)聽(tīng)的網(wǎng)絡(luò)端口。默認(rèn)端口號(hào)是 80 |
| path | URL 的路徑組件說(shuō)明了資源位于服務(wù)器的什么地方 |
| params | URL 中通過(guò)協(xié)議參數(shù)來(lái)訪問(wèn)資源,比名值對(duì)列表,分號(hào)分割來(lái)進(jìn)行訪問(wèn) |
| query | 字符串是通過(guò)提問(wèn)問(wèn)題或進(jìn)行查詢來(lái)縮小請(qǐng)求資源類的范圍 |
| frag | 為了引用部分資源或資源的一個(gè)片段,比如 URL 指定 HTML 文檔中一個(gè)圖片或一個(gè)小節(jié) |
基本結(jié)構(gòu)
type URL struct {
Scheme string //具體指訪問(wèn)服務(wù)器上的資源使用的哪種協(xié)議
Opaque string // 編碼后的不透明數(shù)據(jù)
User *Userinfo // 用戶名和密碼信息,有些協(xié)議需要傳入明文用戶名和密碼來(lái)獲取資源,比如 FTP
Host string // host或host:port,服務(wù)器地址,可以是 IP 地址,也可以是域名信息
Path string //路徑,使用"/"分隔
RawPath string // 已編碼的路徑提示(參見(jiàn)EscapedPath方法)
ForceQuery bool // 添加一個(gè)查詢('?'),即使RawQuery為空
RawQuery string // 編碼后的查詢字符串,沒(méi)有'?'
Fragment string // 引用的片段(文檔位置),沒(méi)有'#'
}
常用方法
地址解析Parse,詳細(xì)參數(shù)
func main() {
urlString := "https://admin:passwd@www.baidu.com:80/search?mq=test#12345"
u, err := url.Parse(urlString)
if err != nil {
fmt.Println("parse error ", err)
}
fmt.Printf("u type is %T, u is %#v\n", u, u)
/*
u type is *url.URL,
u is &url.URL{
Scheme:"https", Opaque:"", User:(*url.Userinfo)(0xc000088150),
Host:"www.baidu.com:80", Path:"/search", RawPath:"", ForceQuery:false,
RawQuery:"mq=test", Fragment:"12345"
}
*/
fmt.Printf("u.Scheme is %#v\n", u.Scheme) // u.Scheme is "https"
fmt.Printf("u.Opaque is %#v\n", u.Opaque) // u.Opaque is ""
fmt.Printf("u.User is %#v\n", u.User)
// u.User is &url.Userinfo{username:"admin", password:"passwd", passwordSet:true}
fmt.Printf("u.Host is %#v\n", u.Host) // u.Host is "www.baidu.com:80"
fmt.Printf("u.Path is %#v\n", u.Path) // u.Path is "/search"
fmt.Printf("u.RawPath is %#v\n", u.RawPath) // u.RawPath is ""
fmt.Printf("u.ForceQuery is %#v\n", u.ForceQuery) // u.ForceQuery is false
fmt.Printf("u.RawQuery is %#v\n", u.RawQuery) // u.RawQuery is "mq=test"
fmt.Printf("u.Fragment is %#v\n", u.Fragment) // u.Fragment is "12345"
}
ParseRequestURI
ParseRequestURI 函數(shù)解析 rawurl 為一個(gè) URL 結(jié)構(gòu)體,本函數(shù)會(huì)假設(shè) rawurl 是在一個(gè) HTTP 請(qǐng)求里,因此會(huì)假設(shè)該參數(shù)是一個(gè)絕對(duì) URL 或者絕對(duì)路徑,并會(huì)假設(shè)該 URL 沒(méi)有 #fragment 后綴。
func ParseRequestURI(rawurl string) (url *URL, err error)
func main() {
urlString := "https://admin:passwd@www.baidu.com:80/search?mq=test#12345"
u, err := url.ParseRequestURI(urlString)
if err != nil {
fmt.Println("parse error ", err)
}
fmt.Printf("u.Fragment is %#v\n", u.Fragment) // u.Fragment is ""
}
判斷是否是絕對(duì)路徑func (*URL) IsAbs
func (u *URL) IsAbs() bool //絕對(duì)路徑返回true
func (*URL) Query
Query 方法解析 RawQuery 字段并返回其表示的 Values 類型鍵值對(duì)。
func (u *URL) Query() Values //map[mq:[test]]
func (*URL) RequestURI
RequestURI 方法返回編碼好的 path?query 或 opaque?query 字符串,用在 HTTP 請(qǐng)求里。
func (u *URL) RequestURI() string ///search?mq=test
func (*URL) String
String 將 URL 重構(gòu)為一個(gè)合法 URL 字符串。
func (u *URL) String() string //https://admin:passwd@www.baidu.com:80/search?mq=test#12345
func (*URL) Parse
Parse 方法以 u 為上下文來(lái)解析一個(gè) URL , ref 可以是絕對(duì)或相對(duì) URL。本方法解析失敗會(huì)返回 nil , err ;否則返回結(jié)果和 ResolveReference 一致。
func main() {
urlString := "https://www.baidu.com/search?mq=rabbitmq&queue=people#12345"
u, err := url.Parse(urlString)
if err != nil {
fmt.Println("parse error ", err)
}
fmt.Printf("u.IsAbs is %#v\n", u.IsAbs()) // u.IsAbs is true
fmt.Printf("u.Query is %#v\n", u.Query())
// u.Query is url.Values{"mq":[]string{"rabbitmq"}, "queue":[]string{"people"}}
fmt.Printf("u.RequestURI is %#v\n", u.RequestURI())
// u.RequestURI is "/search?mq=rabbitmq&queue=people"
fmt.Printf("u.String is %#v\n", u.String())
// u.String is "https://www.baidu.com/search?mq=rabbitmq&queue=people#12345"
}
func (*URL) ResolveReference
本方法根據(jù)一個(gè)絕對(duì) URI 將一個(gè) URI 補(bǔ)全為一個(gè)絕對(duì) URI 。參數(shù) ref 可以是絕對(duì) URI 或者相對(duì) URI 。 ResolveReference 總是返回一個(gè)新的 URL 實(shí)例,即使該實(shí)例和 u 或者 ref完全一樣。如果 ref 是絕對(duì) URI ,本方法會(huì)忽略參照 URI 并返回 ref 的一個(gè)拷貝。
func (u *URL) ResolveReference(ref *URL) *URL
type Values
Values 將建映射到值的列表。它一般用于查詢的參數(shù)和表單的屬性。不同于 http.Header 這個(gè)字典類型, Values 的鍵是大小寫(xiě)敏感的。
type Values map[string][]string
func ParseQuery
ParseQuery 函數(shù)解析一個(gè) URL 編碼的查詢字符串,并返回可以表示該查詢的 Values 類型的字典。本函數(shù)總是返回一個(gè)包含了所有合法查詢參數(shù)的非 nil 字典, err 用來(lái)描述解碼時(shí)遇到的(如果有)第一個(gè)錯(cuò)誤。
func ParseQuery(query string) (m Values, err error)
func main() {
rawUrl := "mq=rabbitmq&queue=people"
v, err := url.ParseQuery(rawUrl)
if err != nil {
fmt.Println("ParseQuery error ", err)
}
fmt.Printf("v type is %T, v is %#v\n", v, v)
// v type is url.Values, v is url.Values{"mq":[]string{"rabbitmq"}, "queue":[]string{"people"}}
// 等價(jià)于下面的方法
urlString := "https://www.baidu.com/search?mq=rabbitmq&queue=people#12345"
u, _ := url.Parse(urlString)
queryV := u.Query()
fmt.Printf("queryV type is %T, queryV is %#v\n", queryV, queryV)
// queryV type is url.Values, queryV is url.Values{"mq":[]string{"rabbitmq"}, "queue":[]string{"people"}}
}
Get、Set、Add、Del、 Encode
//Get 會(huì)獲取 key 對(duì)應(yīng)的值集的第一個(gè)值。如果沒(méi)有對(duì)應(yīng)key的值集會(huì)返回空字符串。獲取值集請(qǐng)直接用 map 。
func (v Values) Get(key string) string
//Set 方法將 key 對(duì)應(yīng)的值集設(shè)為只有 value ,它會(huì)替換掉已有的值集。
func (v Values) Set(key, value string)
//Add 將 value 添加到 key 關(guān)聯(lián)的值集里原有的值的后面。
func (v Values) Add(key, value string)
//Del 刪除 key 關(guān)聯(lián)的值集
func (v Values) Del(key string)
//Encode 方法將 v 編碼為 ur 編碼格式(“bar=baz&foo=quux”),編碼時(shí)會(huì)以鍵進(jìn)行排序
func (v Values) Encode() string
func main() {
rawUrl := "mq=rabbitmq&queue=people"
v, err := url.ParseQuery(rawUrl)
if err != nil {
fmt.Println("ParseQuery error ", err)
}
fmt.Printf("v type is %T, v is %#v\n", v, v)
// v type is url.Values, v is url.Values{"mq":[]string{"rabbitmq"}, "queue":[]string{"people"}}
fmt.Println(v.Get("mq")) // rabbitmq
v.Set("mq", "redis")
fmt.Println(v.Get("mq")) // redis
v.Add("name", "wohu")
fmt.Printf("v is %#v\n", v)
// v is url.Values{"mq":[]string{"redis"}, "name":[]string{"wohu"}, "queue":[]string{"people"}}
fmt.Printf("v.Encode is %#v\n", v.Encode()) // v.Encode is "mq=redis&name=wohu&queue=people"
v.Del("name")
fmt.Printf("v is %#v\n", v)
// v is url.Values{"mq":[]string{"redis"}, "queue":[]string{"people"}}
}
查詢轉(zhuǎn)義:QueryEscape、QueryUnescape
QueryEscape
QueryEscape 函數(shù)對(duì) s 進(jìn)行轉(zhuǎn)碼使之可以安全的用在 URL 查詢里。
func QueryEscape(s string) string
func QueryUnescape
QueryUnescape 函數(shù)用于將 QueryEscape 轉(zhuǎn)碼的字符串還原。它會(huì)把 %AB 改為字節(jié) 0xAB ,將 + 改為空格 。如果有某個(gè) % 后面未跟兩個(gè)十六進(jìn)制數(shù)字,本函數(shù)會(huì)返回錯(cuò)誤。
func QueryUnescape(s string) (string, error)
func main() {
rawUrl := "mq=rabbitmq&queue=people"
stdUrl := url.QueryEscape(rawUrl)
fmt.Printf("stdUrl is %v\n", stdUrl) // stdUrl is mq%3Drabbitmq%26queue%3Dpeople
rawurl, _ := url.QueryUnescape(stdUrl)
fmt.Printf("rawurl is %v\n", rawurl) // rawurl is mq=rabbitmq&queue=people
}到此這篇關(guān)于golang net.url標(biāo)準(zhǔn)庫(kù)的具體使用的文章就介紹到這了,更多相關(guān)golang net.url標(biāo)準(zhǔn)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解如何使用Golang操作MongoDB數(shù)據(jù)庫(kù)
在現(xiàn)代開(kāi)發(fā)中,數(shù)據(jù)存儲(chǔ)是一個(gè)至關(guān)重要的環(huán)節(jié),MongoDB作為一種NoSQL數(shù)據(jù)庫(kù),提供了強(qiáng)大的功能和靈活的數(shù)據(jù)模型,與Golang的高性能和并發(fā)性能非常契合,本文將探討Golang與MongoDB的完美組合,介紹如何使用Golang操作MongoDB數(shù)據(jù)庫(kù),需要的朋友可以參考下2023-11-11
詳解Go語(yǔ)言如何判斷兩個(gè)對(duì)象是否相等
在編程中,判斷兩個(gè)對(duì)象是否相等是一項(xiàng)常見(jiàn)的任務(wù),同時(shí)判斷對(duì)象是否相等在很多情況下都非常重要,所以在接下來(lái)的內(nèi)容中,我們將詳細(xì)介紹在?Go?語(yǔ)言中如何判斷對(duì)象是否相等的方法和技巧,需要的可以參考一下2023-06-06
Go語(yǔ)言字符串及strings和strconv包使用實(shí)例
字符串是工作中最常用的,值得我們專門(mén)的練習(xí)一下,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言字符串及strings和strconv包使用的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06
Go 請(qǐng)求兔子識(shí)別接口實(shí)現(xiàn)流程示例詳解
這篇文章主要為大家介紹了Go 請(qǐng)求兔子識(shí)別接口實(shí)現(xiàn)流程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Go中的fuzz模糊測(cè)試使用實(shí)戰(zhàn)詳解
這篇文章主要為大家介紹了Go中的fuzz模糊測(cè)試使用實(shí)戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Golang實(shí)現(xiàn)gRPC的Proxy的原理解析
gRPC是Google開(kāi)始的一個(gè)RPC服務(wù)框架, 是英文全名為Google Remote Procedure Call的簡(jiǎn)稱,廣泛的應(yīng)用在有RPC場(chǎng)景的業(yè)務(wù)系統(tǒng)中,這篇文章主要介紹了Golang實(shí)現(xiàn)gRPC的Proxy的原理,需要的朋友可以參考下2021-09-09

