C# 解析获取Url参数值
今天遇到一个需求,需要处理通过接口传过来的一个参数,参数内容为一个拼接好的Url地址,且该地址还会携带了一些额外的参数,包括但不限于数字,字符串,json串。样例如下:
http://www.cplemom.com/?url=https://www.cnblogs.com/cplemom/?id=15&data={"id":12,"name":"今天天气不错"}
现在的问题就是,我需要将url参数中的data值的json中的id修改为url参数中id的值,然后再拼接成完整的url去获取数据。简单来说就是将url进行如下改变,现在问题的重点就在于如何根据url获取对应的参数值了。
//处理前
https://www.cnblogs.com/cplemom/?id=15&data={"id":12,"name":"今天天气不错"}
//处理后
https://www.cnblogs.com/cplemom/?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.cnblogs.com/cplemom/?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':'今天天气不错'}
该方法有几个要注意的点
uri.Query是?开头的,但是在转为键值对以后被自动过滤掉了,且只会过滤一个?字符- 参数内容会自动使用UTF-8解码
- 对于传递的数组参数(
?ids=1&ids=2),会通过, - 在参数字符中通过&划分后,只会把第一个=前的字符串作为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参数值的更多相关文章
- js获取url参数值(HTML之间传值)
<h3>未设置设备: <a href="javascript:addTab('设备列表','PKE_DeviceContent/PKE_DeviceContent.aspx ...
- 替换所有字符串,获取url参数值
替换所有的字符串: var newStr = str.replace(/null/g, ""); 获取url参数值 <script type="text/javas ...
- js获取url参数值的两种方式
js获取url参数值的方法有很多,下面也为大家介绍两种. 方法一:正则分析法 function getQueryString(name) { var reg = new RegExp(" ...
- C#获取URL参数值
原文:C#获取URL参数值 在写程序的时候,我们经常需要对页面进行传参数,比如page?id=1234,那么在page这个页面中就直接可以使用string id = Request.QueryStri ...
- js获取url参数值的几种方式
一.原生js获取URL参数值: 比如当前URL为:http://localhost:8080/#/page2?id=100&name=guanxy <template> <d ...
- C#获取URL参数值(NameValueCollection)
在写程序的时候,我们经常需要对页面进行传参数,比如page?id=1234,那么在page这个页面中就直接可以使用string id = Request.QueryString["id&qu ...
- js获取url参数值的方法总结
1.方式一:通过字符串截取的方式获取参数值: 1).函数一:获取URL中的参数名及参数值的集合 /** * [获取URL中的参数名及参数值的集合] * 示例URL:http://htmlJsTest/ ...
- js获取url参数值,js获取其他页面传递而来的值
index.htm?参数1=数值1&参数2=数值2&参数3=数据3&参数4=数值4&...... 静态html文件js读取url参数 根据获取html的参数值控制htm ...
- js获取url参数值的方法
index.htm?参数1=数值1&参数2=数值2&参数3=数据3&参数4=数值4&...... 静态html文件js读取url参数 根据获取html的参数值控制htm ...
随机推荐
- Virtuoso 中 display.drf、techfile.tf、tech.db 之间的关系,以及 Packet 在它们之间的作用
https://www.cnblogs.com/yeungchie/ 一般工艺库下的"技术文件"有 tech.db 和 techfile.tf , Packet 是 display ...
- Hive和HBase
1. 两者分别是什么? Apache Hive是一个构建在Hadoop基础设施之上的数据仓库.通过Hive可以使用HQL语言查询存放在HDFS上的数据.HQL是一种类SQL语言,这种语言最终被转化为M ...
- linux的软件管理的rpm包和yum配置加tar解压包和安装编译./configuer
软件管理 rpm包 和yum 1.软件形式 Linux系统的第三方软件,无论是应用软件还是工具软件,大多以以下两种形式之一发行: 源代码形式 预编译形式 获取的源代码形式的软件,需要对其 ...
- python 创建字典以及操作字典----这是基础知识
当你编程久了,发现所有的东西都是建立在基础之上的,庞大的代码 你要识别出它的类型是什么 或者返回后类型是什么!? 根据返回的类型 或者需要操作的对象是什么类型 就可以选择相应的方法进行处理 #创建字 ...
- VSCode C++环境配置(个人使用)
tasks.json { "version": "2.0.0", "command": "g++", "arg ...
- IDEA新增类的快捷键
1.选中新建类所在包,鼠标右击.然后依次点击New——>Java Class就可以弹出输入类名的弹出框了. 2.选中新建类所在包,按下alt+insert然后选择弹出框中的Jav ...
- Linux学习笔记之linux的文件目录结构
Linux环境下,一切皆文件! linux和windows系统有区别, windows是在各个硬盘上进行分区,分区里面又有好多文件, 而linux是采用树状的目录结构,所有都在根目录 / 下,所有 ...
- 华为云的研究成果又双叒叕被MICCAI收录了!
摘要:2020年国际医学图像计算和计算机辅助干预会议(MICCAI 2020),论文接收结果已经公布:华为云医疗AI团队和华中科技大学合作的2篇研究成果入选. 语义/实例分割问题是近年来医学图像计算领 ...
- Spring Boot打包瘦身 Docker 使用全过程 动态配置、日志记录配置
springBoot打包的时候代码和jar包打包在同一个jar包里面,会导致jar包非常庞大,在不能连接内网的时候调试代码,每次只改动了java代码就需要把所有的jar包一起上传,导致传输文件浪费了很 ...
- Linux安装配置PHPmyadmin
进官网下载zip安装包 wget https://files.phpmyadmin.net/phpMyAdmin/5.0.1/phpMyAdmin-5.0.1-all-languages.zip 安装 ...