写点什么

Go 语言入门很简单:net/url 包

作者:宇宙之一粟
  • 2022 年 4 月 26 日
  • 本文字数:3619 字

    阅读完需:约 12 分钟

Go 语言入门很简单:net/url 包

引言

在 Golang 中,将 URL 打包用于从服务器获取数据非常重要。只需了解您是否正在处理任何应用程序并且您想从任何外部位置或服务器获取此应用程序的数据,都需要我们可以使用 URL。

URL 格式

URL 包含各种参数:例如 端口、URL 中的搜索字符串等。 URL 可以包含各种方法,允许它处理 URL 属性和进行修改,例如,如果我们有一个类似的 URL www.exmple.com:3000 ,3000 是 URL 的端口,借助 net/url 中的封装函数我们可以访问端口号,同理,还可以检查 URL 格式是否有效。

先来看一下常见 URL 的格式:

<schema>://<user>:<password>@<host>:<port>/<path>:<params>?<query>#<frag>
复制代码
  • scheme : 方案是如何访问指定资源的主要标识符,他会告诉负责解析 URL 应用程序应该使用什么协议;

  • user :用户名;

  • password :密码;

  • host : 主机组件标识了因特网上能够访问资源的宿主机器,可以有主机名或者是 IP 地址来表示;

  • port : 端口标识了服务器正在监听的网络端口。默认端口号是 80;

  • path : URL 的路径组件说明了资源位于服务器的什么地方;

  • params : URL 中通过协议参数来访问资源,比名值对列表,分号分割来进行访问;

  • query : 字符串是通过提问问题或进行查询来缩小请求资源类的范围;

  • frag : 为了引用部分资源或资源的一个片段,比如 URL 指定 HTML 文档中一个图片或一个小节;


HTTP 通常只处理整个对象,而不是对象的片段,客户端不能将片段传送给服务器。浏览器从服务器获取整个资源之后,会根据片段来显示你感兴趣的片段部分。

Go url 包函数使用格式

Go 的 net/url 提供了众多处理 URL 的内置函数,这些函数的使用格式如下:

URL, error := url.inbuilt-function-name("url")
复制代码
  • URL:这包含 URL 名称和 URL 的一些基本细节。我们可以给它起任何名字。它就像任何变量一样。

  • error: 这是 error 部分,以防 URL 错误或出现任何异常,在这种情况下 URL 将返回错误,并且该 error 将在 error 部分中捕获。

  • inbuilt-function-name:正如我们所讨论的,URL 包中有许多函数可以处理 URL,例如 ParsePathRawpathstring() 所有这些函数我们可以用于不同的目的。


如何使用 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()}
复制代码

运行结果:

$ go run main.goUrl before modification is https://www.baidu.com/s?wd=golangThe url after modification is https://bing.com/s?q=go&wd=golang
复制代码


在 Golang 中对查询字符串进行 URL 编码

Go 的 net/url 包包含一个名为 QueryEscape 的内置方法,用于对字符串进行转义/编码,以便可以安全地将其放置在 URL 查询中。以下示例演示了如何在 Golang 中对查询字符串进行编码:

package main
import ( "fmt" "net/url")
func main() { query := "Hello World" fmt.Println(url.QueryEscape(query))}
复制代码

运行结果:

$ go run main.goHello+World
复制代码


在 Golang 中对多个查询参数进行 URL 编码

如果您想一次编码多个查询参数,那么您可以创建一个 url.Values 结构,其中包含查询参数到值的映射,并使用 url.Values.Encode() 方法对所有查询参数进行编码。


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.goname=%40Wade&phone=%2B111111111111
复制代码


在 Golang 中对路径段进行 URL 编码

就像 QueryEscape 一样,Go 中的 net/url 包有另一个名为 PathEscape() 的函数来对字符串进行编码,以便它可以安全地放置在 URL 的路径段中:

package main
import ( "fmt" "net/url")
func main() { path := "path with?reserved+characters" fmt.Println(url.PathEscape(path))}
复制代码

运行结果:

$ go run main.gopath%20with%3Freserved+characters
复制代码


通过对各个部分进行编码来构建完整的 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.goEncoded 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.goUrl before modification is http://bing.com/good%2badThe URL path is /good+adThe URL raw path is /good%2badThe 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.goUrl before modification is ../../..//search?q=phphttp://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()}
复制代码

运行结果:

$ go run main.goThe 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.goThe Url is falseThe 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.goURL1 before modification is https://example.orgURL2 before modification is https://example.org:8080URL2 Port number is 8080
复制代码


总结

从本教程中,我们了解了 go url 包 的基本概念,并了解了 url 的概念语法。并逐渐展示了 url 的部分功能以及 url 的主要用途,希望读者可以在官方文档中学习其他方法。


参考链接 :https://pkg.go.dev/net/url

发布于: 刚刚阅读数: 2
用户头像

宇宙古今无有穷期,一生不过须臾,当思奋争 2020.05.07 加入

🏆InfoQ写作平台-第二季签约作者 🏆 混迹于江湖,江湖却没有我的影子 热爱技术,专注于后端全栈,轻易不换岗 拒绝内卷,工作于软件工程师,弹性不加班 热衷分享,执着于阅读写作,佛系不水文

评论

发布
暂无评论
Go 语言入门很简单:net/url 包_url_宇宙之一粟_InfoQ写作社区