ASP.NET Core MVC获取请求的参数方法示例

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

接受请求并进行解析获取参数

根据参数进行渲染并输出响应内容

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

URL

Header

Body

下面看看ASP.NET Core是如何从这几个位置获取参数的。

通过URL获取参数

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


  协议  
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); }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwzpyw.html