Go 语言入门之net/url 包
来源:脚本之家
时间:2022-12-24 20:17:45 403浏览 收藏
来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《Go 语言入门之net/url 包》,介绍一下语言、net/url,希望对大家的知识积累有所帮助,助力实战开发!
引言
在 Golang 中,将 URL 打包用于从服务器获取数据非常重要。只需了解您是否正在处理任何应用程序并且您想从任何外部位置或服务器获取此应用程序的数据,都需要我们可以使用 URL。
URL 格式
URL 包含各种参数:例如 端口、URL 中的搜索字符串等。 URL 可以包含各种方法,允许它处理 URL 属性和进行修改,例如,如果我们有一个类似的 URL www.exmple.com:3000
,3000 是 URL 的端口,借助 net/url
中的封装函数我们可以访问端口号,同理,还可以检查 URL 格式是否有效。
先来看一下常见 URL 的格式:
:// : @ : / : ? #
scheme
: 方案是如何访问指定资源的主要标识符,他会告诉负责解析URL
应用程序应该使用什么协议;user
:用户名;password
:密码;host
: 主机组件标识了因特网上能够访问资源的宿主机器,可以有主机名或者是IP
地址来表示;port
: 端口标识了服务器正在监听的网络端口。默认端口号是 80;path
:URL
的路径组件说明了资源位于服务器的什么地方;params
:URL
中通过协议参数来访问资源,比名值对列表,分号分割来进行访问;query
: 字符串是通过提问问题或进行查询来缩小请求资源类的范围;frag
: 为了引用部分资源或资源的一个片段,比如URL
指定HTML
文档中一个图片或一个小节;
HTTP
通常只处理整个对象,而不是对象的片段,客户端不能将片段传送给服务器。浏览器从服务器获取整个资源之后,会根据片段来显示你感兴趣的片段部分。
对应 Go 中 URL 的结构体:
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 包函数使用格式
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,例如
Parse
、Path
、Rawpath
、string()
所有这些函数我们可以用于不同的目的。
如何使用 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.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
的内置方法,用于对字符串进行转义/编码,以便可以安全地将其放置在 URL 查询中。以下示例演示了如何在 Golang 中对查询字符串进行编码:
package main import ( "fmt" "net/url" ) func main() { query := "Hello World" fmt.Println(url.QueryEscape(query)) }
运行结果:
$ go run main.go
Hello+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.go
name=%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.go
path%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.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() }
运行结果:
$ 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
今天带大家了解了语言、net/url的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~
-
456 收藏
-
251 收藏
-
368 收藏
-
336 收藏
-
111 收藏
-
473 收藏
-
377 收藏
-
384 收藏
-
246 收藏
-
110 收藏
-
210 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
-
- 高大的御姐
- 这篇技术文章出现的刚刚好,细节满满,感谢大佬分享,码住,关注老哥了!希望老哥能多写Golang相关的文章。
- 2023-02-23 02:01:30
-
- 受伤的秋天
- 赞 👍👍,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢up主分享文章内容!
- 2023-01-29 07:43:17
-
- 追寻的犀牛
- 这篇博文真及时,太细致了,太给力了,已收藏,关注老哥了!希望老哥能多写Golang相关的文章。
- 2023-01-01 01:07:31
-
- 时尚的鱼
- 这篇技术文章真是及时雨啊,太全面了,太给力了,码起来,关注作者了!希望作者能多写Golang相关的文章。
- 2022-12-30 16:23:20
-
- 伶俐的小松鼠
- 细节满满,已收藏,感谢作者的这篇文章内容,我会继续支持!
- 2022-12-30 05:41:08
-
- 凶狠的日记本
- 赞 👍👍,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢老哥分享技术贴!
- 2022-12-27 08:56:54
-
- 天真的小鸭子
- 真优秀,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢博主分享技术文章!
- 2022-12-25 21:57:45