C# 如何解析獲取Url參數(shù)值
今天遇到一個(gè)需求,需要處理通過(guò)接口傳過(guò)來(lái)的一個(gè)參數(shù),參數(shù)內(nèi)容為一個(gè)拼接好的Url地址,且該地址還會(huì)攜帶了一些額外的參數(shù),包括但不限于數(shù)字,字符串,json串。樣例如下:
https://shequ.jb51.net/?url=m.fzitv.net/?id=15&data={"id":12,"name":"今天天氣不錯(cuò)"}
現(xiàn)在的問(wèn)題就是,我需要將url參數(shù)中的data值的json中的id修改為url參數(shù)中id的值,然后再拼接成完整的url去獲取數(shù)據(jù)。簡(jiǎn)單來(lái)說(shuō)就是將url進(jìn)行如下改變,現(xiàn)在問(wèn)題的重點(diǎn)就在于如何根據(jù)url獲取對(duì)應(yīng)的參數(shù)值了。
//處理前
http://m.fzitv.net/?id=15&data={"id":12,"name":"今天天氣不錯(cuò)"}
//處理后
http://m.fzitv.net/?id=15&data={"id":15,"name":"今天天氣不錯(cuò)"}
Url編碼
這里插一句,在將url作為參數(shù)進(jìn)行請(qǐng)求的時(shí)候,需要注意一些特殊字符(比如 ? "" / 等)對(duì)請(qǐng)求的影響,特別是發(fā)送Get請(qǐng)求的時(shí)候??梢栽诎l(fā)送請(qǐng)求前,先對(duì)url進(jìn)行編碼處理。
encodeURIComponent(url) //js HttpUtility.UrlEncode(url) //C# url.QueryEscape(url) //Go
獲取Url參數(shù)
仔細(xì)思考了下,解析url獲取參數(shù)的也無(wú)非通過(guò)分割關(guān)鍵字符來(lái)實(shí)現(xiàn)。區(qū)別就是分割字符的方式是通過(guò)正則匹配或者遍歷字符罷了。下面就介紹框架帶的方法,然后通過(guò)總結(jié)一些規(guī)律,最后自己實(shí)現(xiàn)一個(gè)方法。
我知道肯定有很多朋友經(jīng)常使用HttpUtility類中的UrlEncode/UrlDecode方法,其實(shí)該類還有一個(gè)ParseQueryString方法,用來(lái)解析url參數(shù)。該方法需要傳入url參數(shù)部分字符串,然后返回一個(gè)NameValueCollection對(duì)象(以key/value的形式記錄了所有參數(shù))。
string url = "http://m.fzitv.net/?id=15&data={'id':12,'name':'今天天氣不錯(cuò)'}";
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':'今天天氣不錯(cuò)'}
該方法有幾個(gè)要注意的點(diǎn)
- uri.Query是?開頭的,但是在轉(zhuǎn)為鍵值對(duì)以后被自動(dòng)過(guò)濾掉了,且只會(huì)過(guò)濾一個(gè)?字符
- 參數(shù)內(nèi)容會(huì)自動(dòng)使用UTF-8解碼
- 對(duì)于傳遞的數(shù)組參數(shù)(?ids=1&ids=2),會(huì)通過(guò),
- 在參數(shù)字符中通過(guò)&劃分后,只會(huì)把第一個(gè)=前的字符串作為key
基于上述一些要求就可以自己寫一個(gè)解析參數(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.去除第一個(gè)前導(dǎo)?字符
var dic = uri.Query.Substring(1)
//2.通過(guò)&劃分各個(gè)參數(shù)
.Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries)
//3.通過(guò)=劃分參數(shù)key和value,且保證只分割第一個(gè)=字符
.Select(param => param.Split(new char[] { '=' }, 2, StringSplitOptions.RemoveEmptyEntries))
//4.通過(guò)相同的參數(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é)
總體來(lái)說(shuō)這只是一個(gè)小小的功能點(diǎn),往往框架本身就幫我們封裝好了解析url獲取參數(shù)的方法,但是自己去實(shí)現(xiàn)的時(shí)候,可能就會(huì)有這樣那樣的情況沒(méi)有考慮到。最后如果有遇到相似需求的朋友,我建議還是用HttpUtility.ParseQueryString()吧~~~
以上就是C# 如何解析獲取Url參數(shù)值的詳細(xì)內(nèi)容,更多關(guān)于c# 解析獲取Url參數(shù)值的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- JavaScript、C# URL編碼、解碼總結(jié)
- C#Url操作類封裝、仿Node.Js中的Url模塊實(shí)例
- C#實(shí)現(xiàn)在網(wǎng)頁(yè)中根據(jù)url截圖并輸出到網(wǎng)頁(yè)的方法
- C#檢查字符串是否是合法URL地址的方法
- C#實(shí)現(xiàn)自動(dòng)識(shí)別URL網(wǎng)址的方法
- C#實(shí)現(xiàn)類似新浪微博長(zhǎng)URL轉(zhuǎn)短地址的方法
- C#分析URL參數(shù)并獲取參數(shù)和值對(duì)應(yīng)列表的方法
- C#利用System.Uri轉(zhuǎn)URL為絕對(duì)地址的方法
- asp.net C#檢查URL是否有效的方法
- C#獲取當(dāng)前頁(yè)面的URL示例代碼
- URL中去除指定參數(shù)實(shí)現(xiàn)C#代碼
相關(guān)文章
c#中的interface abstract與virtual介紹
abstract 與virtual : 方法重寫時(shí)都使用 override 關(guān)鍵字,interface中的方法和abstract方法都要求實(shí)現(xiàn)2013-07-07
C# 字符串string和內(nèi)存流MemoryStream及比特?cái)?shù)組byte[]之間相互轉(zhuǎn)換
本文主要介紹字符串string和內(nèi)存流MemoryStream及比特?cái)?shù)組byte[]之間相互轉(zhuǎn)換的方法,需要的小伙伴可以參考一下。2016-05-05
Unity實(shí)現(xiàn)簡(jiǎn)單換裝系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)簡(jiǎn)單換裝系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
C#使用HttpClient對(duì)大文件進(jìn)行斷點(diǎn)上傳和下載
這篇文章主要介紹了C#如何使用HttpClient對(duì)大文件進(jìn)行斷點(diǎn)上傳和下載,文章通過(guò)代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-06-06
C#中利用代理實(shí)現(xiàn)觀察者設(shè)計(jì)模式詳解
學(xué)習(xí)模式注重精髓而非模板,本文為了便于說(shuō)明假定了三方并對(duì)三方功能進(jìn)行了劃分,實(shí)際應(yīng)用并不拘泥于此。如果情況合適將數(shù)據(jù)(文檔)類設(shè)計(jì)為單件模式也是一種很不錯(cuò)的選擇2014-01-01
關(guān)于C#數(shù)強(qiáng)轉(zhuǎn)會(huì)不會(huì)拋出異常詳解
這篇文章主要給大家介紹了關(guān)于C#數(shù)強(qiáng)轉(zhuǎn)會(huì)不會(huì)拋出異常的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04
C#設(shè)計(jì)模式之Visitor訪問(wèn)者模式解決長(zhǎng)隆歡樂(lè)世界問(wèn)題實(shí)例
這篇文章主要介紹了C#設(shè)計(jì)模式之Visitor訪問(wèn)者模式解決長(zhǎng)隆歡樂(lè)世界問(wèn)題,簡(jiǎn)單描述了訪問(wèn)者模式的定義并結(jié)合具體實(shí)例形式分析了C#使用訪問(wèn)者模式解決長(zhǎng)隆歡樂(lè)世界問(wèn)題的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-09-09
在winform下實(shí)現(xiàn)左右布局多窗口界面的方法之續(xù)篇
這篇文章主要介紹了在winform下實(shí)現(xiàn)左右布局多窗口界面的方法之續(xù)篇 的相關(guān)資料,需要的朋友可以參考下2016-02-02

