C# 如何解析获取Url参数值

所属分类: 软件编程 / C#教程 阅读数: 152
收藏 0 赞 0 分享

今天遇到一个需求,需要处理通过接口传过来的一个参数,参数内容为一个拼接好的Url地址,且该地址还会携带了一些额外的参数,包括但不限于数字,字符串,json串。样例如下:

https://shequ.jb51.net/?url=www.jb51.net/?id=15&data={"id":12,"name":"今天天气不错"}

现在的问题就是,我需要将url参数中的data值的json中的id修改为url参数中id的值,然后再拼接成完整的url去获取数据。简单来说就是将url进行如下改变,现在问题的重点就在于如何根据url获取对应的参数值了。

//处理前
https://www.jb51.net/?id=15&data={"id":12,"name":"今天天气不错"}

//处理后
https://www.jb51.net/?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 = "https://www.jb51.net/?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':'今天天气不错'}

该方法有几个要注意的点

  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参数值的资料请关注脚本之家其它相关文章!

更多精彩内容其他人还在看

c#开发word批量转pdf源码分享

已经安装有Office环境,借助一些简单的代码即可实现批量Word转PDF,看下面的实例源码吧
收藏 0 赞 0 分享

c# xml API操作的小例子

这篇文章主要介绍了c# xml API操作的小例子,有需要的朋友可以参考一下
收藏 0 赞 0 分享

c#唯一值渲染实例代码

这篇文章主要介绍了c#唯一值渲染实例代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

淘宝IP地址库采集器c#代码

这篇文章主要介绍了淘宝IP地址库采集器c#代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

C#在后台运行操作(BackgroundWorker用法)示例分享

BackgroundWorker类允许在单独的专用线程上运行操作。如果需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题,下面看示例
收藏 0 赞 0 分享

c#文本加密程序代码示例

这是一个加密软件,但只限于文本加密,加了窗口控件的滑动效果,详细看下面的代码
收藏 0 赞 0 分享

c#生成站点地图(SiteMapPath)文件示例程序

这篇文章主要介绍了c#生成站点地图(SiteMapPath)文件的示例,大家参考使用
收藏 0 赞 0 分享

C# 键盘Enter键取代Tab键实现代码

这篇文章主要介绍了C# 键盘Enter键取代Tab键实现代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

C# WinForm导出Excel方法介绍

在.NET应用中,导出Excel是很常见的需求,导出Excel报表大致有以下三种方式:Office PIA,文件流和NPOI开源库,本文只介绍前两种方式
收藏 0 赞 0 分享

C#串口通信程序实例详解

在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports,创建C#串口通信程序的具体实现是如何的呢?让我们开始吧
收藏 0 赞 0 分享
查看更多