C# 如何解析獲取Url參數(shù)值
今天遇到一個需求,需要處理通過接口傳過來的一個參數(shù),參數(shù)內(nèi)容為一個拼接好的Url地址,且該地址還會攜帶了一些額外的參數(shù),包括但不限于數(shù)字,字符串,json串。樣例如下:
https://shequ.jb51.net/?url=www.dbjr.com.cn/?id=15&data={"id":12,"name":"今天天氣不錯"}
現(xiàn)在的問題就是,我需要將url參數(shù)中的data值的json中的id修改為url參數(shù)中id的值,然后再拼接成完整的url去獲取數(shù)據(jù)。簡單來說就是將url進(jìn)行如下改變,現(xiàn)在問題的重點(diǎn)就在于如何根據(jù)url獲取對應(yīng)的參數(shù)值了。
//處理前 http://www.dbjr.com.cn/?id=15&data={"id":12,"name":"今天天氣不錯"} //處理后 http://www.dbjr.com.cn/?id=15&data={"id":15,"name":"今天天氣不錯"}
Url編碼
這里插一句,在將url作為參數(shù)進(jìn)行請求的時候,需要注意一些特殊字符(比如 ? "" / 等)對請求的影響,特別是發(fā)送Get請求的時候??梢栽诎l(fā)送請求前,先對url進(jìn)行編碼處理。
encodeURIComponent(url) //js HttpUtility.UrlEncode(url) //C# url.QueryEscape(url) //Go
獲取Url參數(shù)
仔細(xì)思考了下,解析url獲取參數(shù)的也無非通過分割關(guān)鍵字符來實(shí)現(xiàn)。區(qū)別就是分割字符的方式是通過正則匹配或者遍歷字符罷了。下面就介紹框架帶的方法,然后通過總結(jié)一些規(guī)律,最后自己實(shí)現(xiàn)一個方法。
我知道肯定有很多朋友經(jīng)常使用HttpUtility
類中的UrlEncode/UrlDecode
方法,其實(shí)該類還有一個ParseQueryString
方法,用來解析url參數(shù)。該方法需要傳入url參數(shù)部分字符串,然后返回一個NameValueCollection
對象(以key/value的形式記錄了所有參數(shù))。
string url = "http://www.dbjr.com.cn/?id=15&data={'id':12,'name':'今天天氣不錯'}"; var uri = new Uri(url); var collection= HttpUtility.ParseQueryString(uri.Query);//默認(rèn)采用UTF-8編碼,當(dāng)然也可以傳入特定編碼進(jìn)行解析 //var collection= HttpUtility.ParseQueryString(uri.Query,Encoding.ASCII); Console.WriteLine(collection["data"]);//輸出結(jié)果: {'id':12,'name':'今天天氣不錯'}
該方法有幾個要注意的點(diǎn)
- uri.Query是?開頭的,但是在轉(zhuǎn)為鍵值對以后被自動過濾掉了,且只會過濾一個?字符
- 參數(shù)內(nèi)容會自動使用UTF-8解碼
- 對于傳遞的數(shù)組參數(shù)(?ids=1&ids=2),會通過,
- 在參數(shù)字符中通過&劃分后,只會把第一個=前的字符串作為key
基于上述一些要求就可以自己寫一個解析參數(shù)的方式了。
public static Dictionary<string, string> ParseQueryString(string url) { if (string.IsNullOrWhiteSpace(url)) { throw new ArgumentNullException("url"); } var uri = new Uri(url); if (string.IsNullOrWhiteSpace(uri.Query)) { return new Dictionary<string, string>(); } //1.去除第一個前導(dǎo)?字符 var dic = uri.Query.Substring(1) //2.通過&劃分各個參數(shù) .Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries) //3.通過=劃分參數(shù)key和value,且保證只分割第一個=字符 .Select(param => param.Split(new char[] { '=' }, 2, StringSplitOptions.RemoveEmptyEntries)) //4.通過相同的參數(shù)key進(jìn)行分組 .GroupBy(part => part[0], part => part.Length > 1 ? part[1] : string.Empty) //5.將相同key的value以,拼接 .ToDictionary(group => group.Key, group => string.Join(",", group)); return dic; }
總結(jié)
總體來說這只是一個小小的功能點(diǎn),往往框架本身就幫我們封裝好了解析url獲取參數(shù)的方法,但是自己去實(shí)現(xiàn)的時候,可能就會有這樣那樣的情況沒有考慮到。最后如果有遇到相似需求的朋友,我建議還是用HttpUtility.ParseQueryString()
吧~~~
以上就是C# 如何解析獲取Url參數(shù)值的詳細(xì)內(nèi)容,更多關(guān)于c# 解析獲取Url參數(shù)值的資料請關(guān)注腳本之家其它相關(guān)文章!
- JavaScript、C# URL編碼、解碼總結(jié)
- C#Url操作類封裝、仿Node.Js中的Url模塊實(shí)例
- C#實(shí)現(xiàn)在網(wǎng)頁中根據(jù)url截圖并輸出到網(wǎng)頁的方法
- C#檢查字符串是否是合法URL地址的方法
- C#實(shí)現(xiàn)自動識別URL網(wǎng)址的方法
- C#實(shí)現(xiàn)類似新浪微博長URL轉(zhuǎn)短地址的方法
- C#分析URL參數(shù)并獲取參數(shù)和值對應(yīng)列表的方法
- C#利用System.Uri轉(zhuǎn)URL為絕對地址的方法
- asp.net C#檢查URL是否有效的方法
- C#獲取當(dāng)前頁面的URL示例代碼
- URL中去除指定參數(shù)實(shí)現(xiàn)C#代碼
相關(guān)文章
通過C#實(shí)現(xiàn)獲取PDF頁面大小、方向和旋轉(zhuǎn)角度
在處理PDF文件時,了解頁面的大小、方向和旋轉(zhuǎn)角度等信息對于PDF的顯示、打印和布局設(shè)計(jì)至關(guān)重要,本文將介紹如何使用免費(fèi).NET?庫通過C#來讀取PDF頁面的這些屬性,需要的朋友可以參考下2024-08-08服務(wù)器端C#實(shí)現(xiàn)的CSS解析器
服務(wù)器端C#實(shí)現(xiàn)的CSS解析器2008-09-09淺談c#.net中巧用ToString()將日期轉(zhuǎn)成想要的格式
有時候我們要對時間進(jìn)行轉(zhuǎn)換,達(dá)到不同的顯示效果,更多的該怎么辦呢?2013-03-03C#枚舉數(shù)值與名稱的轉(zhuǎn)換實(shí)例分享
在應(yīng)用枚舉的時候,時常需要將枚舉和數(shù)值相互轉(zhuǎn)換的情況。有時候還需要轉(zhuǎn)換成相應(yīng)的中文。下面介紹一種方法2013-08-08C#實(shí)現(xiàn)文件篩選讀取并翻譯的自動化工具
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)文件篩選及讀取內(nèi)容,并翻譯的自動化工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-03-03SQLite之C#版 System.Data.SQLite使用方法
這篇文章主要介紹了SQLite之C#版 System.Data.SQLite使用方法,需要的朋友可以參考下2020-10-10