net/url
时间:2022-06-22
本文章向大家介绍net/url,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
url包解析URL的重要工具,我们研究一下里面的具体功能
- 1.URL 介绍
- 2.查询条件进行转码,可以安全的使用在URL查询
- 3.将QueryEscape转码的字符串还原
- 4.将url字符串,解析为请求需要的字符格式
- 5.获取编码好的请求资源路径URI
- 6.检查请求是否为绝度路径URL
- 7.查询条件的操作
1.URL 介绍
URL基本格式如下
scheme://[userinfo@]host/path[?query][#fragment]
scheme: 协议 http(s),ws(s),ftp等 [userinfo@]:用户信息 host:主机地址 path:资源路径 query:查询条件 fragment:引用的片段(文档位置)
go中的URL 结构
type URL struct {
Scheme string
Opaque string // 编码后的不透明数据
User *Userinfo // 用户名和密码信息
Host string // host或host:port
Path string
RawQuery string // 编码后的查询字符串,没有'?'
Fragment string // 引用的片段(文档位置),没有'#'
}
下面我们演示如何将一个字符串url解析成标准的URL 结构体
func main() {
u, err := url.Parse("http://bing.com/search?q=dotnet")
if err != nil {
log.Fatal()
}
fmt.Println(u.Scheme) //http
fmt.Println(u.Host) //bing.com
fmt.Println(u.Path) //search
fmt.Println(u.Query()) //map[q:[dotnet]]
fmt.Println(u.User) // nil
fmt.Println(u.RawQuery) // q=dotnet
fmt.Println(u.Fragment) //nil
fmt.Println(u.Opaque) // nil
fmt.Println(u.Hostname()) // search
fmt.Println(u.EscapedPath()) //search 安全路径 search= 它会解析为 search%3D
fmt.Println(u.IsAbs()) // true
fmt.Println(u.Port()) //nil
fmt.Println(u.RawPath) //nil
}
这里需要注意一下 u.Path 字段,如果你的连接为 http://bing.com/%47%6f%2f?q=dotnet,那么保存的路径不是/%47%6f%2f 而是/G0/,因为路径是以解码后的字段保存的
问题来了 如果有两个路径 http://bing.com/%47%6f%2f?q=dotnet
和 http://bing.com/Go/?q=dotnet
u.RawPath
2.查询条件进行转码
func main() {
fmt.Println(url.QueryEscape("name=124&sex=123"))
}
name%3D124%26sex%3D123
3.将QueryEscape转码的字符串还原
func main() {
fmt.Println(url.QueryUnescape("name%3D124%26sex%3D123"))
}
name=124&sex=123 <nil>
4.将url字符串,解析为请求需要的字符格式
ParseRequestURI函数解析rawurl为一个URL结构体,本函数会假设rawurl是在一个HTTP请求里,因此会假设该参数是一个绝对URL或者绝对路径,并会假设该URL没有#fragment后缀。(网页浏览器会在去掉该后缀后才将网址发送到网页服务器)
u, err := url.ParseRequestURI("http://bing.com/search?q=dotnet#name")
if err != nil {
log.Fatal()
}
fmt.Println(u.String())
image.png
5.获取编码好的请求字符串
func main() {
u, err := url.Parse("https://baidu.com/search?q=dotnet#name")
if err != nil {
log.Fatal()
}
fmt.Println(u.RequestURI())
}
image.png
6.检查请求是否为绝度url
u, err := url.Parse("/images/01.gif?q=dotnet#name")
if err != nil {
log.Fatal()
}
fmt.Println(u.IsAbs()) // false
7.查询条件的操作
scheme://[userinfo@]host/path[?query][#fragment]
主要针对query 的一些操作
func main() {
v := url.Values{}
v.Set("name", "Ava")
v.Add("friend", "Jess")
v.Add("friend", "Sarah")
v.Add("friend", "Zoe")
fmt.Println(v.Get("name"))
fmt.Println(v.Encode())
v.Del("name")
fmt.Println(v.Encode())
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- wordpress迁移至hugo及其自动化发布文章全记录
- 视频流媒体平台EasyNVR硬件设备使用华科云arm版如何修改为固定IP?
- 详解 IP 地址
- k8s解决pod调度不均衡的问题
- 如何获取视频流媒体服务器EasyNVR的临时授权机器码?
- Mybatis-Plus常用注解
- IDEA 你不知道小技巧——后缀法自动生成代码(Postfix Completion)
- Mybatis-Plus使用乐观锁
- k8s基础之调度策略(二)
- k8s基础之调度策略(一)
- 你知道在 cmd 输入 ping 之后发生了什么吗? —— 详解 ICMP 协议
- 路由选择协议 RIP、OSPF、BGP 详解
- 手把手教你 SQL 多表查询
- 容器基础之cgroups学习(一)
- axios使用