Nancy获取Request.Form的所有参数

Nancy是一个轻量级的webapi框架,在用Nancy框架的时候,我们经常要获取到接口的所有动态参数值,

但是Nancy的Request.Form不能够直接转成NameValueCollection。

在这里,我先将Request.Form序列化成json格式字符串,在反序列化成List集合,来进行获取所有的key,

从而用key获取到所有的参数的值,存入字典类中。

下面插入方法代码:

public Dictionary<string, string> GetRequestPost()
        {
            List<string> list = JsonDynamicUtil.ToList(JsonDynamicUtil.ToJson(Request.Form));
            Dictionary<string, string> dic = new Dictionary<string, string>();
            foreach (var iten in list)
            {
                dic.Add(iten, Request.Form[iten]);
            }
            return dic;
        }

下面是需要用到的序列化对象操作类:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Dynamic;
using System.Linq;
using System.Web;
using System.Web.Script.Serialization;

namespace Base
{
    public class JsonDynamicUtil
    {
        public static dynamic ToDynamic(string json)
        {
            JavaScriptSerializer jss = new JavaScriptSerializer();
            jss.RegisterConverters(new JavaScriptConverter[] { new DynamicJsonConverter() });
            dynamic dy = jss.Deserialize(json, typeof(object)) as dynamic;
            return dy;
        }
        public static string ToJson(dynamic d)
        {
            JavaScriptSerializer oSerializer = new JavaScriptSerializer();
            oSerializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoJSONConverter() });
            string json = oSerializer.Serialize(d);
            return json;
        }

        public static List<string> ToList(string json)
        {
            JavaScriptSerializer jss = new JavaScriptSerializer();
            jss.RegisterConverters(new JavaScriptConverter[] { new DynamicJsonConverter() });
            List<string> dy = jss.Deserialize(json, typeof(List<string>)) as List<string>;
            return dy;
        }
    }
    public class DynamicJsonConverter : JavaScriptConverter
    {
        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            if (dictionary == null)
                throw new ArgumentNullException("dictionary");

            if (type == typeof(object))
            {
                return new DynamicJsonObject(dictionary);
            }

            return null;
        }

        public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
        {
            throw new NotImplementedException();
        }

        public override IEnumerable<Type> SupportedTypes
        {
            get { return new ReadOnlyCollection<Type>(new List<Type>(new Type[] { typeof(object) })); }
        }
    }
    public class DynamicJsonObject : DynamicObject
    {
        private IDictionary<string, object> Dictionary { get; set; }

        public DynamicJsonObject(IDictionary<string, object> dictionary)
        {
            this.Dictionary = dictionary;
        }

        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = this.Dictionary[binder.Name];

            if (result is IDictionary<string, object>)
            {
                result = new DynamicJsonObject(result as IDictionary<string, object>);
            }
            else if (result is ArrayList && (result as ArrayList) is IDictionary<string, object>)
            {
                result = new List<DynamicJsonObject>((result as ArrayList).ToArray().Select(x => new DynamicJsonObject(x as IDictionary<string, object>)));
            }
            else if (result is ArrayList)
            {
                result = new List<object>((result as ArrayList).ToArray());
            }

            return this.Dictionary.ContainsKey(binder.Name);
        }
    }
    public class ExpandoJSONConverter : JavaScriptConverter
    {
        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            throw new NotImplementedException();
        }

        public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
        {
            var result = new Dictionary<string, object>();
            var dictionary = obj as IDictionary<string, object>;

            foreach (var item in dictionary)
                result.Add(item.Key, item.Value);

            return result;
        }

        public override IEnumerable<Type> SupportedTypes
        {
            get
            {
                return new ReadOnlyCollection<Type>(new Type[] { typeof(System.Dynamic.ExpandoObject) });
            }
        }
    }
}

如果你有更好的获取方式,希望可以留言指点一下,谢谢

参考:

https://blog.csdn.net/jingvencn/article/details/41868479

原文地址:https://www.cnblogs.com/luol/p/10217519.html

时间: 2024-10-29 10:56:34

Nancy获取Request.Form的所有参数的相关文章

获取request中的查询参数

//获取request中的查询参数 public static Map<String, Object> getRequestParamsByMap(HttpServletRequest request) { Map<String,Object> qmap=new HashMap<String,Object>(); Enumeration<String> paraNames = request.getParameterNames(); while(paraNa

Request.Form为什么不能获取html传递来的数据?

//只有form method="get"时才可用Request.QueryString["one"]方法        //string one = Request.QueryString["one"];        //string two = Request.QueryString["two"]; //只有form method="post"时才可用Request.Form方法,否则出错, acti

java获取request中的参数

1.用request.getParameterMap()获取url中的所有参数 Map map=request.getParameterMap(); Set keSet=map.entrySet(); for(Iterator itr=keSet.iterator();itr.hasNext();){ @SuppressWarnings("rawtypes") Map.Entry me=(Map.Entry)itr.next(); Object ok=me.getKey(); Obje

WebAPI.请求(Request)的参数(Parameter)里包含特殊字符(#等)的正确处理方式 从客户端xx中检测到有潜在危险的Request.Form值

事故现场 报错"从客户端 中检测到有潜在危险的Request.Form值" //后台代码 namespace Test { [RoutePrefix("TestClass")] [EnableCors("*", "*", "*")] public class TestClassController { [HttpGet] [Route("GetByName/{userId}/{userName}&

Request.Form和Request和Request.querystring的区别

Request.Form是获取以POST方式提交的表单数据: Request.QueryString主要是获取地址栏参数或者以Get方式提交的数据 而Request则包含以上两种方式,会在Request.QueryString和Request.Form中都查询一遍变量.但是优先获取GET方式提交的数据,即Request.QueryString Request:包含以上两种方式(优先获取GET方式提交的数据),它会在QueryString.Form.ServerVariable中都搜寻一遍. 而且

asp.net Request、Request.Form、Request.QueryString的区别(转)

Request.Form:获取以POST方式提交的数据. Request.QueryString:获取地址栏参数(以GET方式提交的数据). Request:包含以上两种方式(优先获取GET方式提交的数据),它会在QueryString.Form.ServerVariable中都搜寻一遍. 有时候会得到不同的结果.如果仅仅需要Form中的数据,但是使用了Request而不是Request.Form,那么程序将在QueryString.ServerVariable中也搜寻一遍.如果其中有同名的项,

request和request.form和request.querystring的区别

Request.Form是获取以POST方式提交的表单数据: Request.QueryString主要是获取地址栏参数或者以Get方式提交的数据 而Request则包含以上两种方式,会在Request.QueryString和Request.Form中都查询一遍变量.但是优先获取GET方式提交的数据,即Request.QueryString Request:包含以上两种方式(优先获取GET方式提交的数据),它会在QueryString.Form.ServerVariable中都搜寻一遍. 而且

request.querystring和request.form、session的区别

1. request.querystring是用来接收地址里面问号“?”后面的参数的内容,  用get方法读取的 不安全   request.form是用来接收表单递交来的数据 ,是用post方法读取的form表单中的method中看你是get还是post ,一般form中都用post. session是在一个会话的整个过程中保存数据,知道浏览器关闭数据消失定义session["Name"]=李四形式 2.request对象有五个集合,下面予以介绍: QueryString:用以获取客

Request、Request.Form、Request.QueryString 用法的区别

Request.Form:获取以POST方式提交的数据. Request.QueryString:获取地址栏参数(以GET方式提交的数据). Request:包含以上两种方式(优先获取GET方式提交的数据),它会在QueryString.Form.ServerVariable中都搜寻一遍. 有时候会得到不同的结果.如果仅仅需要Form中的数据,但是使用了Request而不是Request.Form,那么程序将在QueryString.ServerVariable中也搜寻一遍.如果其中有同名的项,