Go?語言入門之net/url?包
引言
在 Golang 中,將 URL 打包用于從服務(wù)器獲取數(shù)據(jù)非常重要。只需了解您是否正在處理任何應(yīng)用程序并且您想從任何外部位置或服務(wù)器獲取此應(yīng)用程序的數(shù)據(jù),都需要我們可以使用 URL。
URL 格式
URL 包含各種參數(shù):例如 端口、URL 中的搜索字符串等。 URL 可以包含各種方法,允許它處理 URL 屬性和進行修改,例如,如果我們有一個類似的 URL www.exmple.com:3000
,3000 是 URL 的端口,借助 net/url
中的封裝函數(shù)我們可以訪問端口號,同理,還可以檢查 URL 格式是否有效。
先來看一下常見 URL 的格式:
<schema>://<user>:<password>@<host>:<port>/<path>:<params>?<query>#<frag>
scheme
: 方案是如何訪問指定資源的主要標識符,他會告訴負責解析URL
應(yīng)用程序應(yīng)該使用什么協(xié)議;user
:用戶名;password
:密碼;host
: 主機組件標識了因特網(wǎng)上能夠訪問資源的宿主機器,可以有主機名或者是IP
地址來表示;port
: 端口標識了服務(wù)器正在監(jiān)聽的網(wǎng)絡(luò)端口。默認端口號是 80;path
:URL
的路徑組件說明了資源位于服務(wù)器的什么地方;params
:URL
中通過協(xié)議參數(shù)來訪問資源,比名值對列表,分號分割來進行訪問;query
: 字符串是通過提問問題或進行查詢來縮小請求資源類的范圍;frag
: 為了引用部分資源或資源的一個片段,比如URL
指定HTML
文檔中一個圖片或一個小節(jié);
HTTP
通常只處理整個對象,而不是對象的片段,客戶端不能將片段傳送給服務(wù)器。瀏覽器從服務(wù)器獲取整個資源之后,會根據(jù)片段來顯示你感興趣的片段部分。
對應(yīng) Go 中 URL 的結(jié)構(gòu)體:
type URL struct { Scheme string Opaque string // encoded opaque data User *Userinfo // username and password information Host string // host or host:port Path string // path (relative paths may omit leading slash) RawPath string // encoded path hint (see EscapedPath method) ForceQuery bool // append a query ('?') even if RawQuery is empty RawQuery string // encoded query values, without '?' Fragment string // fragment for references, without '#' RawFragment string // encoded fragment hint (see EscapedFragment method) }
Go url 包函數(shù)使用格式
Go 的 net/url
提供了眾多處理 URL 的內(nèi)置函數(shù),這些函數(shù)的使用格式如下:
URL, error := url.inbuilt-function-name("url")
- URL:這包含 URL 名稱和 URL 的一些基本細節(jié)。我們可以給它起任何名字。它就像任何變量一樣。
- error: 這是 error 部分,以防 URL 錯誤或出現(xiàn)任何異常,在這種情況下 URL 將返回錯誤,并且該 error 將在 error 部分中捕獲。
- inbuilt-function-name:正如我們所討論的,URL 包中有許多函數(shù)可以處理 URL,例如
Parse
、Path
、Rawpath
、string()
所有這些函數(shù)我們可以用于不同的目的。
如何使用 URL 包
在了解 url
包的工作原理之前我們需要了解基本的使用。當我們點擊任何 url
時,它可以包含許多屬性,比如它可以有一些端口、它可以有一些搜索、它可以有一些路徑等,所以我們使用 URL 來操作和處理所有這些東西。讓我們了解一下 go 語言中 URL
包 的工作原理。
package main import ( "fmt" "log" "net/url" ) func TestURL() { URL, err := url.Parse("https://www.baidu.com/s?wd=golang") fmt.Println("Url before modification is", URL) if err != nil { log.Fatal("An error occurs while handling url", err) } URL.Scheme = "https" URL.Host = "bing.com" query := URL.Query() query.Set("q", "go") URL.RawQuery = query.Encode() fmt.Println("The url after modification is", URL) } func main() { TestURL() }
運行結(jié)果:
$ go run main.go
Url before modification is https://www.baidu.com/s?wd=golang
The url after modification is https://bing.com/s?q=go&wd=golang
在 Golang 中對查詢字符串進行 URL 編碼
Go 的 net/url
包包含一個名為 QueryEscape
的內(nèi)置方法,用于對字符串進行轉(zhuǎn)義/編碼,以便可以安全地將其放置在 URL 查詢中。以下示例演示了如何在 Golang 中對查詢字符串進行編碼:
package main import ( "fmt" "net/url" ) func main() { query := "Hello World" fmt.Println(url.QueryEscape(query)) }
運行結(jié)果:
$ go run main.go
Hello+World
在 Golang 中對多個查詢參數(shù)進行 URL 編碼
如果您想一次編碼多個查詢參數(shù),那么您可以創(chuàng)建一個 url.Values
結(jié)構(gòu),其中包含查詢參數(shù)到值的映射,并使用 url.Values.Encode()
方法對所有查詢參數(shù)進行編碼。
package main import ( "fmt" "net/url" ) func main() { params := url.Values{} params.Add("name", "@Wade") params.Add("phone", "+111111111111") fmt.Println(params.Encode()) }
運行代碼:
$ go run main.go
name=%40Wade&phone=%2B111111111111
在 Golang 中對路徑段進行 URL 編碼
就像 QueryEscape
一樣,Go 中的 net/url
包有另一個名為 PathEscape()
的函數(shù)來對字符串進行編碼,以便它可以安全地放置在 URL 的路徑段中:
package main import ( "fmt" "net/url" ) func main() { path := "path with?reserved+characters" fmt.Println(url.PathEscape(path)) }
運行結(jié)果:
$ go run main.go
path%20with%3Freserved+characters
通過對各個部分進行編碼來構(gòu)建完整的 URL
最后,我們來看一個完整的 Golang 中 URL 解析和 URL 編碼的例子:
package main import ( "fmt" "net/url" ) func main() { // Let's start with a base url baseUrl, err := url.Parse("http://www.bing.com") if err != nil { fmt.Println("Malformed URL: ", err.Error()) return } // Add a Path Segment (Path segment is automatically escaped) baseUrl.Path += "path with?reserved characters" // Prepare Query Parameters params := url.Values{} params.Add("q", "Hello World") params.Add("u", "@wade") // Add Query Parameters to the URL baseUrl.RawQuery = params.Encode() // Escape Query Parameters fmt.Printf("Encoded URL is %q\n", baseUrl.String()) }
運行代碼:
$ go run main.go
Encoded URL is "http://www.bing.com/path%20with%3Freserved%20characters?q=Hello+World&u=%40wade"
在 Golang 中解析 URL
package main import ( "fmt" "log" "net/url" ) func TestURL() { URL, err := url.Parse("http://bing.com/good%2bad") fmt.Println("Url before modification is", URL) if err != nil { log.Fatal("An error occurs while handling url", err) } fmt.Println("The URL path is", URL.Path) fmt.Println("The URL raw path is", URL.RawPath) fmt.Println("The URL is ", URL.String()) } func main() { TestURL() }
運行代碼:
$ go run main.go
Url before modification is http://bing.com/good%2bad
The URL path is /good+ad
The URL raw path is /good%2bad
The URL is http://bing.com/good%2bad
處理相對路徑
package main import ( "fmt" "log" "net/url" ) func ExampleURL() { URL, error := url.Parse("../../..//search?q=php") fmt.Println("Url before modification is", URL) if error != nil { log.Fatal("An error occurs while handling url", error) } baseURL, err := url.Parse("http://example.com/directory/") if err != nil { log.Fatal("An error occurs while handling url", err) } fmt.Println(baseURL.ResolveReference(URL)) } func main() { ExampleURL() }
$ go run main.go
Url before modification is ../../..//search?q=php
http://example.com/search?q=php
解析空格
package main import ( "fmt" "log" "net/url" ) func ExampleURL() { URL, error := url.Parse("http://example.com/Here path with space") if error != nil { log.Fatal("An error occurs while handling url", error) } fmt.Println("The Url is", URL) } func main() { ExampleURL() }
運行結(jié)果:
$ go run main.go
The Url is http://example.com/Here%20path%20with%20space
判斷絕對地址
package main import ( "fmt" "net/url" ) func main() { u := url.URL{Host: "example.com", Path: "foo"} fmt.Println("The Url is", u.IsAbs()) u.Scheme = "http" fmt.Println("The Url is", u.IsAbs()) }
$ go run main.go
The Url is false
The Url is true
解析端口
package main import ( "fmt" "log" "net/url" ) func ExampleURL() { URL1, error := url.Parse("https://example.org") fmt.Println("URL1 before modification is", URL1) if error != nil { log.Fatal("An error occurs while handling url", error) } URL2, err := url.Parse("https://example.org:8080") if err != nil { log.Fatal("An error occurs while handling url", URL2) } fmt.Println("URL2 before modification is", URL2) fmt.Println("URL2 Port number is", URL2.Port()) } func main() { ExampleURL() }
$ go run main.go
URL1 before modification is https://example.org
URL2 before modification is https://example.org:8080
URL2 Port number is 8080
到此這篇關(guān)于Go 語言入門之net/url 包的文章就介紹到這了,更多相關(guān)Go net/url 包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
prometheus?client_go為應(yīng)用程序自定義監(jiān)控指標
這篇文章主要為大家介紹了prometheus?client_go為應(yīng)用程序自定義監(jiān)控指標詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02Go語言reflect.TypeOf()和reflect.Type通過反射獲取類型信息
這篇文章主要介紹了Go語言reflect.TypeOf()和reflect.Type通過反射獲取類型信息,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04golang?pprof?監(jiān)控goroutine?thread統(tǒng)計原理詳解
這篇文章主要為大家介紹了golang?pprof?監(jiān)控goroutine?thread統(tǒng)計原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04