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.pswp.cn/web/39829.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/39829.shtml
英文地址,請注明出處:http://en.pswp.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…