欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET Core MVC 如何获取请求的参数

程序员文章站 2022-03-20 15:37:45
一次HTTP请求,就是一次标准IO操作。请求是I,是输入;响应式O,是输出。任何web开发框架,其实都是在干这两件事: + 接受请求并进行解析获取参数 + 根据参数进行渲染并输出响应内容 所以我们学习一个框架,我认为最首要的是知道如何从请求中获取参数。http请求携带参数的地方主要有下面几个地方: ......

一次http请求,就是一次标准io操作。请求是i,是输入;响应式o,是输出。任何web开发框架,其实都是在干这两件事:

  • 接受请求并进行解析获取参数
  • 根据参数进行渲染并输出响应内容

所以我们学习一个框架,我认为最首要的是知道如何从请求中获取参数。http请求携带参数的地方主要有下面几个地方:

  • url
  • header
  • body
    下面看看asp.net core是如何从这几个位置获取参数的。

通过url获取参数

通过url传参是http最最常用的办法。这里简单介绍下url相关的知识。一个url主要分成4个部分,以http://localhost:5000/fromurl/test?name=mjzhou&age=10为例:

http:// 协议
localhost:5000 主机地址
/fromurl/test path
name=mjzhou&age=10 querystring

我们通常使用path跟querystring来传递参数。新建一个mvc项目,新建一个controller名为fromurlcontroller,通过几个action来演示如何从url上获取参数。

通过querysting获取参数

request.query对象

        // /fromurl/test?name=mjzhou
        public iactionresult test()
        {
            var name = request.query["name"];
            return content(name);
        }

request.query对象包含了本次请求的querystring的键值对列表,所以可以通过它轻松获取querystring上携带的参数。

自动参数绑定

        // /fromurl/test?name=mjzhou
        public iactionresult test1(string name)
        {
            return content(name);
        }

如果action的型参的名称跟querystring的key一致,则mvc框架会自动帮我们绑定参数的值,不用手动获取。

        public iactionresult test2([fromquery(name = "id")]string bh)
        {
            return content(bh);
        }

如果参数绑定的名称跟querystring的key不一致,可以使用fromqueryattribute强制指定绑定的key的名称。

通过path获取参数

request.path对象

//      /fromurl/test3
        public iactionresult test3()
        {
            var path = request.path;
            return content(path);
        }

request.path对象包含了本次http请求的path的原始信息,一般可以通过/来分隔,手工获取想要的参数。

自动参数绑定

//      /fromurl/test4/mjzhou/1000
        [route("fromurl/test4/{name}/{id}")]
        public iactionresult test4(string name, int id)
        {
            return content($"{name}/{id}");
        }

path的自动参数绑定,需要配合routeattribute实现,routeattribute主要是指定一个path的模板,通过这个模板可以告诉路由是否匹配这个action,另外一个就是可以告诉参数绑定,如何解析这个path实现参数绑定。

        [route("fromurl/test6/{name}/{id}")]
        public iactionresult test6([fromroute(name ="name")]string xm, [fromroute(name = "id")]int bh)
        {
            return content($"{xm}/{bh}");
        }

如果action的型参名称跟routeattribute模板的中的名称不一样,那么可以使用fromroute强制指定解析的名称。

        [httpget("fromurl/test5/{name}/{id}")]
        public iactionresult test5(string name, int id)
        {
            return content($"{name}/{id}");
        }

httpgetattribute、httppostattribute等attribute同样可以完成routeattribute的效果,而且还指定了action接受的http method的方法,可以说是加强版的routeattribute。

从header上获取参数

添加一个fromheadercontroller,通过几个action来演示如果从http headers上获取参数。

request.headers对象

        // /fromheader/test
        public iactionresult test()
        {
            var myname = request.headers["myname"];

            return content(myname);
        }

request.headers是一个字典,包含了本次请求的headers。所以我们可以通过request.headers对象轻松获取某个header的值。

自动参数绑定

        public iactionresult test1([fromheader]string myname)
        {
            return content(myname);
        }

通过在action的型参上打上fromheaderattribute,可以告诉框架自动从header获取参数。

        public iactionresult test2([fromheader(name = "myname")]string name)
        {
            return content(name);
        }

如果action的型参跟header的key值不一致,可以通过fromheaderattribute强制指定匹配的header的key值。

从body获取参数

我们开发的时候经常通过表单提交数据,或者通过ajax往后台提交一个javascript对象,本质上这些数据都是通过http的bady提交回去的。新建一个frombodycontroller控制器,通过几个action来演示如何获取body的参数。

request.body对象

        public class model1
        {
            public string name { get; set; }
        }

        public async task<iactionresult> test()
        {
            request.enablebuffering();

            string body = "";
            var stream = request.body;
            if (stream != null)
            {
                stream.seek(0, seekorigin.begin);
                using (var reader = new streamreader(stream, encoding.utf8, true, 1024, true))
                {
                    body = await reader.readtoendasync();
                }
                stream.seek(0, seekorigin.begin);
            }

            var model = jsonconvert.deserializeobject<model1>(body);

            return content(model.name);
        }

request.body是一个stream,保存了本次请求的body数据。所以我们只要把这个stream读出来,就能获取提交的数据。有了原始的数据,就可以通过反序列化等操作转换为模型,更简单的获取参数了。注意,asp.net core想要读取这个对象,必须先调用request.enablebuffering()这个方法。
使用postman测试一下:
ASP.NET Core  MVC 如何获取请求的参数

参数自动绑定

        public iactionresult test1([frombody]model1 model)
        {
            return content(model.name);
        }

使用frombodyattribute可以把body的数据自动反序列化成型参的模型。但是请注意使用[frombody]请求的content-type必须是application-json。
使用postman测试下:
ASP.NET Core  MVC 如何获取请求的参数
ASP.NET Core  MVC 如何获取请求的参数

        public iactionresult test2([fromform]model1 model)
        {
            return content(model.name);
        }

使用fromformattribute可以把body的数据自动反序列化成型参的模型。但是请注意使用[fromform]请求的content-type必须是application/x-www-form-urlencoded。
使用postman测试下:
ASP.NET Core  MVC 如何获取请求的参数
ASP.NET Core  MVC 如何获取请求的参数

总结

asp.net core获取请求参数主要从url,headers,body等位置获取。我们可以通过request.query、request.headers、request.body来手工获取数据。也可以通过[fromquery]、[fromheader]、[frombody]等attribute来实现参数的自动绑定。