golang net.url標準庫的具體使用
Go 語言標準庫中的 net/url 包提供了用于 URL 解析、構建和查詢的功能。這個包使我們能夠處理 URL,從中提取出各個部分,比如協(xié)議、主機、路徑和查詢參數(shù)等。以下是 net/url 包中一些常用的功能:
- 解析URL:使用 Parse 函數(shù)可以將 URL 字符串解析為 url.URL 結構體。
u, err := url.Parse("https://example.com/path?key1=value1&key2=value2") if err != nil { log.Fatal(err) }
- 構建URL:可以使用 url.URL 結構體中的方法來構建 URL。
u := &url.URL{ Scheme: "https", Host: "example.com", Path: "/path", RawQuery: "key1=value1&key2=value2", }
- 查詢參數(shù):url.Values 類型表示 URL 查詢參數(shù),可以用于構建和解析查詢參數(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 結構體中還提供了一些其他方法,比如獲取完整的 URL 字符串、處理路徑、解析主機等等。
基本類型結構
<schema>://<user>:<password>@<host>:<port>/<path>:<params>?<query>#<frag>
參數(shù)描述:
名稱 | 描述 |
---|---|
scheme | 方案是如何訪問指定資源的主要標識符,他會告訴負責解析URL應用程序應該使用什么協(xié)議 |
user | 用戶名 |
password | 密碼 |
host | 主機組件標識了因特網(wǎng)上能夠訪問資源的宿主機器,可以有主機名或者是 IP 地址來表示 |
port | 端口標識了服務器正在監(jiān)聽的網(wǎng)絡端口。默認端口號是 80 |
path | URL 的路徑組件說明了資源位于服務器的什么地方 |
params | URL 中通過協(xié)議參數(shù)來訪問資源,比名值對列表,分號分割來進行訪問 |
query | 字符串是通過提問問題或進行查詢來縮小請求資源類的范圍 |
frag | 為了引用部分資源或資源的一個片段,比如 URL 指定 HTML 文檔中一個圖片或一個小節(jié) |
基本結構
type URL struct { Scheme string //具體指訪問服務器上的資源使用的哪種協(xié)議 Opaque string // 編碼后的不透明數(shù)據(jù) User *Userinfo // 用戶名和密碼信息,有些協(xié)議需要傳入明文用戶名和密碼來獲取資源,比如 FTP Host string // host或host:port,服務器地址,可以是 IP 地址,也可以是域名信息 Path string //路徑,使用"/"分隔 RawPath string // 已編碼的路徑提示(參見EscapedPath方法) ForceQuery bool // 添加一個查詢('?'),即使RawQuery為空 RawQuery string // 編碼后的查詢字符串,沒有'?' Fragment string // 引用的片段(文檔位置),沒有'#' }
常用方法
地址解析Parse,詳細參數(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 為一個 URL 結構體,本函數(shù)會假設 rawurl 是在一個 HTTP 請求里,因此會假設該參數(shù)是一個絕對 URL 或者絕對路徑,并會假設該 URL 沒有 #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 "" }
判斷是否是絕對路徑func (*URL) IsAbs
func (u *URL) IsAbs() bool //絕對路徑返回true
func (*URL) Query
Query 方法解析 RawQuery 字段并返回其表示的 Values 類型鍵值對。
func (u *URL) Query() Values //map[mq:[test]]
func (*URL) RequestURI
RequestURI 方法返回編碼好的 path?query 或 opaque?query 字符串,用在 HTTP 請求里。
func (u *URL) RequestURI() string ///search?mq=test
func (*URL) String
String 將 URL 重構為一個合法 URL 字符串。
func (u *URL) String() string //https://admin:passwd@www.baidu.com:80/search?mq=test#12345
func (*URL) Parse
Parse 方法以 u 為上下文來解析一個 URL , ref 可以是絕對或相對 URL。本方法解析失敗會返回 nil , err ;否則返回結果和 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ù)一個絕對 URI 將一個 URI 補全為一個絕對 URI 。參數(shù) ref 可以是絕對 URI 或者相對 URI 。 ResolveReference 總是返回一個新的 URL 實例,即使該實例和 u 或者 ref完全一樣。如果 ref 是絕對 URI ,本方法會忽略參照 URI 并返回 ref 的一個拷貝。
func (u *URL) ResolveReference(ref *URL) *URL
type Values
Values 將建映射到值的列表。它一般用于查詢的參數(shù)和表單的屬性。不同于 http.Header 這個字典類型, Values 的鍵是大小寫敏感的。
type Values map[string][]string
func ParseQuery
ParseQuery 函數(shù)解析一個 URL 編碼的查詢字符串,并返回可以表示該查詢的 Values 類型的字典。本函數(shù)總是返回一個包含了所有合法查詢參數(shù)的非 nil 字典, err 用來描述解碼時遇到的(如果有)第一個錯誤。
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"}} // 等價于下面的方法 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 會獲取 key 對應的值集的第一個值。如果沒有對應key的值集會返回空字符串。獲取值集請直接用 map 。 func (v Values) Get(key string) string //Set 方法將 key 對應的值集設為只有 value ,它會替換掉已有的值集。 func (v Values) Set(key, value string) //Add 將 value 添加到 key 關聯(lián)的值集里原有的值的后面。 func (v Values) Add(key, value string) //Del 刪除 key 關聯(lián)的值集 func (v Values) Del(key string) //Encode 方法將 v 編碼為 ur 編碼格式(“bar=baz&foo=quux”),編碼時會以鍵進行排序 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"}} }
查詢轉義:QueryEscape、QueryUnescape
QueryEscape
QueryEscape 函數(shù)對 s 進行轉碼使之可以安全的用在 URL 查詢里。
func QueryEscape(s string) string
func QueryUnescape
QueryUnescape 函數(shù)用于將 QueryEscape 轉碼的字符串還原。它會把 %AB 改為字節(jié) 0xAB ,將 + 改為空格 。如果有某個 % 后面未跟兩個十六進制數(shù)字,本函數(shù)會返回錯誤。
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 }
到此這篇關于golang net.url標準庫的具體使用的文章就介紹到這了,更多相關golang net.url標準庫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解如何使用Golang操作MongoDB數(shù)據(jù)庫
在現(xiàn)代開發(fā)中,數(shù)據(jù)存儲是一個至關重要的環(huán)節(jié),MongoDB作為一種NoSQL數(shù)據(jù)庫,提供了強大的功能和靈活的數(shù)據(jù)模型,與Golang的高性能和并發(fā)性能非常契合,本文將探討Golang與MongoDB的完美組合,介紹如何使用Golang操作MongoDB數(shù)據(jù)庫,需要的朋友可以參考下2023-11-11