WebAPI中 request.query、request.body

本文详细介绍了HTTP请求的多种解析方式,包括使用request.query、request.body、request.query_string和request.form等方法,并深入探讨了在.NET Core环境下如何封装Json参数支持过滤器,实现前端Vue与后端WebAPI之间的高效数据交互。

一、方法介绍

     1. request.query

         得到一个FormsDict对象,该对象可以转化为字典,里面的内容是:{"name":"111","password":"cc"}

     2.request.body

        返回一个StringIO对象,通过read方法取出的数据是body里的所有值,不管body里是不是json该方法都原样返回body里的所          有内容。对本例而言是返回:{"name":"abc"}

     3.request.query_string

        它得到的是,url中?后面所有的值,最为一个字符串,即:wzd=111&abc=cc

     4.request.form

        有这么一个表单:

          

        那么要获取username/password有如下方法:

       方法一:

             username = request.forms.get('username1') # 对应的是Username输入框中的name属性

             password = request.forms.get('password1') # 对应的是password输入框中的name属性

      方法二:

             username = request.POST.get('username')

             password = request.POST.get('password')

二、实际运用(.Net Core)

       前端Vue调用:  this.$http.post('/Base_Manage/Base_User/SaveData', this.entity).then(resJson => {})

                                 注释:this.entity为表单生成的JSON

       WebAPI:1.封装Json参数支持过滤器(方法):JsonParamterAttribute

            实现如下:             

    /// <summary>
    /// Json参数支持
    /// </summary>
    public class JsonParamterAttribute : BaseActionFilter, IActionFilter
    {
        /// <summary>
        /// Action执行之前执行
        /// </summary>
        /// <param name="context">过滤器上下文</param>
        public void OnActionExecuting(ActionExecutingContext context)
        {
            if (context.ContainsFilter<NoJsonParamterAttribute>())
                return;

            //参数映射:支持application/json
            string contentType = context.HttpContext.Request.ContentType;
            if (!contentType.IsNullOrEmpty() && contentType.Contains("application/json"))
            {
                //获取Action的所有参数
                var actionParameters = context.ActionDescriptor.Parameters;
                //获取过滤器上下文中的所有参数
                var allParamters = HttpHelper.GetAllRequestParams(context.HttpContext);
                //获取Action的参数及参数对象(比如:添加用户,控制器中的Action参数为User实体对 
                //象)
                var actionArguments = context.ActionArguments;
                //循环所有参数给对象中的属性赋值
                actionParameters.ForEach(aParamter =>
                {
                    string key = aParamter.Name;
                    if (allParamters.ContainsKey(key))
                    {
                        actionArguments[key] = allParamters[key]?.ToString()?.ChangeType_ByConvert(aParamter.ParameterType);
                    }
                    else
                    {
                        try
                        {
                            actionArguments[key] = allParamters.ToJson().ToObject(aParamter.ParameterType);
                        }
                        catch
                        {

                        }
                    }
                });
            }
        }
    }

            获取所有参数的步骤实现:

        /// <summary>
        /// 获取所有请求的参数(包括get参数和post参数)
        /// </summary>
        /// <param name="context">请求上下文</param>
        /// <returns></returns>
        public static Dictionary<string, object> GetAllRequestParams(HttpContext context)
        {
            Dictionary<string, object> allParams = new Dictionary<string, object>();

            var request = context.Request;
            List<string> paramKeys = new List<string>();
            var getParams = request.Query.Keys.ToList();
            var postParams = new List<string>();
            try
            {
                if (request.Method.ToLower() != "get")
                    postParams = request.Form.Keys.ToList();
            }
            catch
            {

            }
            paramKeys.AddRange(getParams);
            paramKeys.AddRange(postParams);

            paramKeys.ForEach(aParam =>
            {
                object value = null;
                if (request.Query.ContainsKey(aParam))
                    value = request.Query[aParam].ToString();
                else if (request.Form.ContainsKey(aParam))
                    value = request.Form[aParam].ToString();

                allParams.Add(aParam, value);
            });

            string contentType = request.ContentType?.ToLower() ?? "";

            //若为POST的application/json
            if (contentType.Contains("application/json"))
            {
                var stream = request.Body;
                string str = stream.ReadToString(Encoding.UTF8);
                if (!str.IsNullOrEmpty())
                {
                    var obj = str.ToJObject();
                    foreach (var aProperty in obj)
                    {
                        allParams[aProperty.Key] = aProperty.Value;
                    }
                }
            }
            return allParams;
        }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值