C#如何解析获取Url参数值
今天遇到⼀个需求,需要处理通过接⼝传过来的⼀个参数,参数内容为⼀个拼接好的Url地址,且该地址还会携带了⼀些额外的参数,包括但不限于数字,字符串,json串。样例如下:
shequ.jb51/?url=www.jb51/?id=15&data={"id":12,"name":"今天天⽓不错"}
现在的问题就是,我需要将url参数中的data值的json中的id修改为url参数中id的值,然后再拼接成完整的url去获取数据。简单来说就是将url进⾏如下改变,现在问题的重点就在于如何根据url获取对应的参数值了。
//处理前
www.jb51/?id=15&data={"id":12,"name":"今天天⽓不错"}
//处理后
www.jb51/?id=15&data={"id":15,"name":"今天天⽓不错"}
Url编码
这⾥插⼀句,在将url作为参数进⾏请求的时候,需要注意⼀些特殊字符(⽐如 ? "" / 等)对请求的影响,特别是发送Get请求的时候。可以在发送请求前,先对url进⾏编码处理。
encodeURIComponent(url) //js
HttpUtility.UrlEncode(url) //C#
url.QueryEscape(url) //Go
获取Url参数
仔细思考了下,解析url获取参数的也⽆⾮通过分割关键字符来实现。区别就是分割字符的⽅式是通过正则匹配或者遍历字符罢了。下⾯就介绍框架带的⽅法,然后通过总结⼀些规律,最后⾃⼰实现⼀个⽅法。
我知道肯定有很多朋友经常使⽤HttpUtility类中的UrlEncode/UrlDecode⽅法,其实该类还有⼀个ParseQueryString⽅法,⽤来解析url参数。该⽅法需要传⼊url参数部分字符串,然后返回⼀个NameValueCollection对象(以key/value的形式记录了所有参数)。
string url = "www.jb51/?id=15&data={'id':12,'name':'今天天⽓不错'}";
var uri = new Uri(url);
var collection= HttpUtility.ParseQueryString(uri.Query);//默认采⽤UTF-8编码,当然也可以传⼊特定编码进⾏解析
//var collection= HttpUtility.ParseQueryString(uri.Query,Encoding.ASCII);
Console.WriteLine(collection["data"]);//输出结果: {'id':12,'name':'今天天⽓不错'}
js获取json的key和value该⽅法有⼏个要注意的点
1. uri.Query是?开头的,但是在转为键值对以后被⾃动过滤掉了,且只会过滤⼀个?字符
2. 参数内容会⾃动使⽤UTF-8解码
3. 对于传递的数组参数(?ids=1&ids=2),会通过,
4. 在参数字符中通过&划分后,只会把第⼀个=前的字符串作为key
基于上述⼀些要求就可以⾃⼰写⼀个解析参数的⽅式了。
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.去除第⼀个前导?字符
var dic = uri.Query.Substring(1)
//2.通过&划分各个参数
.Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries)
//3.通过=划分参数key和value,且保证只分割第⼀个=字符
.Select(param => param.Split(new char[] { '=' }, 2, StringSplitOptions.RemoveEmptyEntries))
//4.通过相同的参数key进⾏分组
.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;
}
总结
总体来说这只是⼀个⼩⼩的功能点,往往框架本⾝就帮我们封装好了解析url获取参数的⽅法,但是⾃⼰去实现的时候,可能就会有这样那样的情况没有考虑到。最后如果有遇到相似需求的朋友,我建议还是⽤HttpUtility.ParseQueryString()吧~~~
以上就是C# 如何解析获取Url参数值的详细内容,更多关于c# 解析获取Url参数值的资料请关注其它相关⽂章!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论