golang net.url 标准库

golang net.url 标准库

Go 语言标准库中的 net/url 包提供了用于 URL 解析、构建和查询的功能。这个包使我们能够处理 URL,从中提取出各个部分,比如协议、主机、路径和查询参数等。以下是 net/url 包中一些常用的功能:

  • 解析URL:使用 Parse 函数可以将 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",
}
  • 查询参数:url.Values 类型表示 URL 查询参数,可以用于构建和解析查询参数。
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 字符串、处理路径、解析主机等等。

福利彩蛋:没有好玩的 API 接口?上百款免费接口等你来,免费 API,免费 API 大全

基本类型结构

<schema>://<user>:<password>@<host>:<port>/<path>:<params>?<query>#<frag>

参数描述:

名称描述
scheme方案是如何访问指定资源的主要标识符,他会告诉负责解析URL应用程序应该使用什么协议
user用户名
password密码
host主机组件标识了因特网上能够访问资源的宿主机器,可以有主机名或者是 IP 地址来表示
port端口标识了服务器正在监听的网络端口。默认端口号是 80
pathURL 的路径组件说明了资源位于服务器的什么地方
paramsURL 中通过协议参数来访问资源,比名值对列表,分号分割来进行访问
query字符串是通过提问问题或进行查询来缩小请求资源类的范围
frag为了引用部分资源或资源的一个片段,比如 URL 指定 HTML 文档中一个图片或一个小节

基本结构

type URL struct {Scheme   string    //具体指访问服务器上的资源使用的哪种协议Opaque   string    // 编码后的不透明数据User     *Userinfo // 用户名和密码信息,有些协议需要传入明文用户名和密码来获取资源,比如 FTPHost     string    // host或host:port,服务器地址,可以是 IP 地址,也可以是域名信息Path     string  //路径,使用"/"分隔RawPath    string    // 已编码的路径提示(参见EscapedPath方法)ForceQuery bool      // 添加一个查询('?'),即使RawQuery为空RawQuery string // 编码后的查询字符串,没有'?'Fragment string // 引用的片段(文档位置),没有'#'
}

常用方法

地址解析Parse,详细参数

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 falsefmt.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 函数解析 rawurl 为一个 URL 结构体,本函数会假设 rawurl 是在一个 HTTP 请求里,因此会假设该参数是一个绝对 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 truefmt.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

本方法根据一个绝对 URI 将一个 URI 补全为一个绝对 URI 。参数 ref 可以是绝对 URI 或者相对 URI 。 ResolveReference 总是返回一个新的 URL 实例,即使该实例和 u 或者 ref完全一样。如果 ref 是绝对 URI ,本方法会忽略参照 URI 并返回 ref 的一个拷贝。

func (u *URL) ResolveReference(ref *URL) *URL

type Values

Values 将建映射到值的列表。它一般用于查询的参数和表单的属性。不同于 http.Header 这个字典类型, Values 的键是大小写敏感的。

type Values map[string][]string

func ParseQuery

ParseQuery 函数解析一个 URL 编码的查询字符串,并返回可以表示该查询的 Values 类型的字典。本函数总是返回一个包含了所有合法查询参数的非 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 关联的值集里原有的值的后面。
func (v Values) Add(key, value string)//Del 删除 key 关联的值集
func (v Values) Del(key string)//Encode 方法将 v 编码为 ur 编码格式(“bar=baz&foo=quux”),编码时会以键进行排序
func (v Values) Encode() stringfunc 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")) // rabbitmqv.Set("mq", "redis")fmt.Println(v.Get("mq")) // redisv.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 函数对 s 进行转码使之可以安全的用在 URL 查询里。

func QueryEscape(s string) string

func QueryUnescape

QueryUnescape 函数用于将 QueryEscape 转码的字符串还原。它会把 %AB 改为字节 0xAB ,将 + 改为空格 。如果有某个 % 后面未跟两个十六进制数字,本函数会返回错误。

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%3Dpeoplerawurl, _ := url.QueryUnescape(stdUrl)fmt.Printf("rawurl is %v\n", rawurl) // rawurl is mq=rabbitmq&queue=people
}

福利彩蛋:没有好玩的 API 接口?上百款免费接口等你来,免费 API,免费 API 大全

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/39829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

下载安装MySQL

1.软件的下载 打开官网下载mysql-installer-community-8.0.37.0.msi 2.软件的安装 mysql下载完成后&#xff0c;找到下载文件&#xff0c;双击安装 3.配置环境变量 4.自带客户端登录与退出

护网蓝队面试

一、sql注入分类 **原理&#xff1a;**没有对用户输入项进行验证和处理直接拼接到查询语句中 查询语句中插⼊恶意SQL代码传递后台sql服务器分析执行 **从注入参数类型分&#xff1a;**数字型注入、字符型注入 **从注入效果分&#xff1a;**报错注入、布尔注入、延时注入、联…

测试引擎模拟接口实战

在上一章的内容中&#xff0c;我简单介绍了整个微服务的各个子模块&#xff0c;还封装了一些工具类。 当然&#xff0c;若还没完成上次内容的也可以点击右侧的传送门------传送门 EngineApplication 在开发测试引擎模拟接口之前&#xff0c;还需要给xxx-engine创建一个Sprin…

bpftrace几种使用实例

1. 排查内存泄漏 memory.c memory.bt 可以执行相关memory&#xff0c;用bpftrace追踪malloc和free的过程 修改memory.bt&#xff0c;加上malloc和free统计&#xff0c;重新执行 2. 验证tcp连接关闭是应用关闭还是内核关闭 nginx服务启动后&#xff0c;会处于监听状态&…

Linux python3.6安装mayavi报错

需要将vtk版本降级&#xff0c;以及uninstall pyqt5&#xff08;安装的vtk版本是9.3.1&#xff09; pip3 install vtk8.1.0 或者9.0.1 报错 Building wheels for collected packages: mayavi Building wheel for mayavi (setup.py) ... error ERROR: Command errored out…

速盾:cdn防止采集?

CDN&#xff08;Content Delivery Network&#xff09;是一种网络加速技术&#xff0c;主要用于分发网站内容给用户&#xff0c;并提供一定的安全保护。CDN的主要作用是通过将网站的静态资源&#xff08;如图片、CSS、JS等&#xff09;缓存到分布在全球各地的服务器上&#xff…

imx6ull/linux应用编程学习(9)串口应用编程

什么是串口&#xff1f; 串口全称叫做串行接口&#xff0c;串行接口指的是数据一个一个的按顺序传输&#xff0c;通信线路简单。使用两条线即可实现双向通信&#xff0c;一条用于发送&#xff0c;一条用于接收。串口通信距离远&#xff0c;但是速度相对会低&#xff0c;串口是一…

GPU相关的一些截图(备查,待整理)

GPU相关的一些截图 这里记录一些与GPU相关的截图,方便查阅

多空决战恒指18000,港股估值有望修复!

港股三大指数早盘冲高午后维持高位震荡&#xff0c;市场情绪回升明显。截至收盘&#xff0c;恒生科技指数大幅上涨0.63表现最佳&#xff0c;恒指、国指分别上涨0.28%及0.23%&#xff0c;恒指盘中一度收复万八关口。但高开后涨幅收窄&#xff0c;截至收盘&#xff0c;恒指涨0.28…

MySQL8 快速导入数据指令load Data 最全详解

MySQL8 快速导入数据指令load Data 最全详解 修改mysql配置文件修改my.ini文件进入mysql,进入库"ceshi"查询你导入的数据表导入数据查询导入的数据 项目基础windows版本MySQL8 修改mysql配置文件 找到mysql的安装目录下的my.ini文件 C:\ProgramData\MySQL\MySQL Serv…

【双出版加持!录用率高!见刊、检索更稳定!】第六届结构抗震与土木工程研究国际学术会议 (ICSSCER 2024,8月16-18)

随着社会的发展&#xff0c;城市规模的不断扩大&#xff0c;建筑形态也趋于多样化和复杂化&#xff0c;建筑结构形式逐渐由规则简单向高层、大跨甚至特殊复杂的方向发展。而房屋建筑是人们正常生活和生产活动的基本场所&#xff0c;房屋建筑结构的安全必须得到充分保障。但是&a…

菱形继承和菱形虚拟继承

c具有多继承的特性&#xff0c;那么菱形继承就是多继承的一种特殊情况&#xff0c;但是菱形继承会出现一些问题&#xff0c;比如数据冗余和二义性&#xff1b; 那么怎么解决这个问题呢&#xff1f; 菱形虚拟继承 菱形虚拟继承的原理 class A { public:int _a; };class B: v…

【Linux】探索网络编程:TCP/UDP协议解析与Socket应用实例

文章目录 前言&#xff1a;1. 预备知识1.1 理解源IP地址和目的IP地址1.2 认识端口号1.3 理解"端口号"和"进程ID"1.4 理解源端口号和目的端口号1.5 认识TCP协议1.6 认识UDP协议1.6 TCP vs UDP 可靠性1.7 网络字节序 2. socket 编程接口2.1 socket 常见API2.…

Pandas数据清洗实战:精准捕捉并优雅过滤异常值,让数据分析更可靠!

1.describe()&#xff1a;查看每一列的描述性统计量 # 导包 import numpy as np import pandas as pddf pd.DataFrame(datanp.random.randint(0,10,size(5,3)),indexlist("ABCDE"),columns["Python","NumPy","Pandas"]) dfdf.descri…

2024年7月5日 十二生肖 今日运势

小运播报&#xff1a;2024年7月5日&#xff0c;星期五&#xff0c;农历五月三十 &#xff08;甲辰年庚午月庚午日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;狗、羊、虎 需要注意&#xff1a;鸡、牛、鼠 喜神方位&#xff1a;西北方 财神方位&#xff1a;正…

联合查询(多表查询)

多表查询是对多张表的数据取笛卡尔积&#xff08;关联查询可以对关联表使用别名&#xff09; 数据准备 insert into classes(name, desc) values (计算机系2019级1班, 学习了计算机原理、C和Java语言、数据结构和算法), (中文系2019级3班,学习了中国传统文学), (自动化2019级5…

土地规划与文化遗产保护:在发展浪潮中守护历史的脉络

在这个日新月异的时代&#xff0c;城市化进程如火如荼&#xff0c;土地规划作为引导城市发展方向的关键&#xff0c;承载着平衡发展与保护的重任。在追求现代化的同时&#xff0c;保护文化遗产不仅是对过去的尊重&#xff0c;更是对未来负责。本文旨在深入探讨如何在土地规划实…

uniapp----- 判断小程序版本有没有更新

const updateManager uni.getUpdateManager();// 当向小程序后台请求完新版本信息&#xff0c;会进行回调updateManager.onCheckForUpdate(function (res) {console.log(是否有新版本, res.hasUpdate);});// 当新版本下载完成&#xff0c;会进行回调updateManager.onUpdateRea…

为了SourceInsight从Linux回到Windows

什么是SourceInsight 现在上网搜索这个软件&#xff0c;大多数说他是一个代码阅读软件&#xff1b;但是在官方的说法里面&#xff0c;这是一款支持多语言的编辑器。大概长这样&#xff1a; 看起来十分老旧是吧&#xff0c;但是他其实他已经是第四代了哈哈哈。其实这个软件是我…

字典树模板+位运算

P3879 [TJOI2010] 阅读理解 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) trie树板子题&#xff0c;稍微有一丢丢不一样&#xff0c;套用字典树模板稍加修改就能过 手搓字典树代码&#xff1a; char ch[1010][26], cnt[1010], idx; void insert(string s)//插入 {int p 0…