ASP.NET中Web API的参数绑定

在这篇文章中,我们将学习WebAPI如何将HTTP请求数据绑定到一个操作方法的参数中。

操作方法在WebAPI控制器中可以有一个或多个不同类型的参数。它可以是基本数据类型或复杂类型。WebAPI根据URL的查询字符串或请求主体中参数类型来绑定操作方法的参数。

如果参数类型是基本数据类型(int,double,string,DateTime,bool等),WebAPI默认将会从URL中获取参数值(即通过querystring)获取。

如果参数类型的复杂类型,WebAPI默认从请求主体中获取参数值。

下表列出了Web API参数绑定的默认规则。

HTTP方法 Query String Request Body
GET 简单类型 不能从请求主体中获取参数值
POST 简单类型 复杂类型
PUT 简单类型 复杂类型
PATCH 简单类型 复杂类型
DELETE 简单类型 不能从请求主体中获取参数值

我们先来看看创建带MVC的Web API项目时自动生成的Values控制器是如何定义的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace WebAPIContainMVC.Controllers
{
    public class ValuesController : ApiController
    {
        // GET api/values
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/values/5
        public string Get(int id)
        {
            return "value";
        }

        // POST api/values
        public void Post([FromBody]string value)
        {
        }

        // PUT api/values/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/values/5
        public void Delete(int id)
        {
        }
    }
}

从Values控制器的定义中,我们可以得出如下几个结论:

(1)WebAPI常规的方法有四个:Get(),Post(),Put()和Delete()。

(2)四种方法的参数可以归纳为两大类:URL传递(Request-url)和Body(Request-body)传递。

(3)可以将四种方法的参数传递归为两大类,而这两大类又集中在Get和Post中体现(Put是Get和Post的组合,Delete和Get类型),所以说研究WebAPI的参数绑定,只需要研究Get和Post方法的参数传递即可,Get对应Request-url,Post对应Request-Body。

在本篇文章中,客户端调用使用Fiddler工具进行测试。

一、Get

1、基本数据类型作为方法参数

1.1方法只含有一个参数(形参可以传递进来)

方法定义如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using WebAPIContainMVC.Entity;

namespace WebAPIContainMVC.Controllers
{
    public class StudentController : ApiController
    {
        [HttpGet]
        public string GetStudentById(int id)
        {
            string strResult=string.Empty;
            List<Student> list = new List<Student>();
            Student stu = new Student()
            {
              StudentId=1,
              Name="Tom",
              Age=20,
              Sex="男"
            };
            list.Add(stu);
            list.ForEach(p =>
            {
                if (p.StudentId.Equals(id))
                {
                    strResult = "存在该学生信息";
                }
                else
                {
                    strResult = "对不起,找不到该学生信息";
                }
            });

        return strResult;
        }
    }
}

客户端调用

结果:

双击左侧的进程,得到如下的结果

1.2、方法含有多个参数(形参可以传递进来)

方法定义如下:

public string GetStudentByIdAndName(int id,string name)
{
            string strResult = string.Empty;
            List<Student> list = new List<Student>();
            Student stu = new Student()
            {
                StudentId = 1,
                Name = "Tom",
                Age = 20,
                Sex = "男"
            };
            list.Add(stu);
            list.ForEach(p =>
            {
                if (p.StudentId.Equals(id)&&p.Name.Equals(name))
                {
                    strResult = "存在该学生信息";
                }
                else
                {
                    strResult = "对不起,找不到该学生信息";
                }
            });

            return strResult;
}

URL地址:http://localhost:63512/api/student?id=1&&name=Tom

结果如下:

2、实体对象类型作为方法参数(形参不能传递进来)

方法定义如下:

[HttpGet]
public string GetStudent(Student student)
{
            string strResult = string.Empty;
            List<Student> list = new List<Student>();
            Student stu = new Student()
            {
                StudentId = 1,
                Name = "Tom",
                Age = 20,
                Sex = "男"
            };
            list.Add(stu);
            if (student != null)
            {
                list.ForEach(p =>
                {
                    if (p.StudentId.Equals(student.StudentId))
                    {
                        strResult = "存在该学生信息";
                    }
                    else
                    {
                        strResult = "对不起,找不到该学生信息";
                    }
                });
            }
            else
            {
                strResult = "参数值为Null";
            }

            return strResult;
}

客户端调用结果如下:

3、基本数据类型和实体对象混合作为方法参数(基本数据类型可以传递进来,实体对象不能传递进来)

4、总结

(1)查询字符串参数名称和操作方法参数名称必须相同(不区分大小写)。参数的先后顺序可以不一致。

(2)Get()参数传递的本质是URL字符串拼接,但是URL字符串的长度受限制。

(3)Get()的参数支持基本数据类型,不支持实体数据类型。

(4)Get()参数的传递是在Http请求的头部传递,而不支持Request-Body传递。

(5)Get类型的方法命名,尽量采用“Get+方法名”的命名方式,在方法前面加上特性:[HttpGet]。

二、Post

1、Post参数传递是在Request-Body内传递。

2、Post参数可以传递基本数据类型,也可以传递实体数据类型。

3、Post操作方法只能包含一个实体数据类型,因为只能允许一个参数读取Request-Body中的数据。

4、Post传递参数时,无论是基本类型参数还是实体类型,均需要借助[FromBody]特性。(有些情况下不写[FromBody]特性也可以把参数传递进来,但为了规范化,最好是加上该特性)。

5、Post类型的方法命名,尽量采用“Post+方法名”的命名方式,在方法前面加上特性:[HttpPost]。

三、FromURI与FromBody

在默认情况下,WebAPI是从查询字符串中得到基本数据类型参数的值,从请求主体中得到复杂类型参数的值,如果想改变这种默认情况怎么办?

可以使用[FromURI]属性,是WebAPI从查询字符串中获取复杂类型参数的值,使用[FromBody]属性可以使WebAPI从请求主体中获取基本数据类型参数的值。

例如下面的Get方法

[HttpGet]
public string GetStudentById([FromUri]Student stu)
{

}

Get方法中包括复杂的类型参数,参数添加了[FromUri]属性,WebAPI将试图从查询字符串中得到Student类型参数的值。

同样,参考下面的Post方法:

[HttpPost]
public string Post([FromBody]string name)
{ }

WebAPI将从请求主体中获取基本类型参数的值,而不是从请求字符串中获取。

到此这篇关于ASP.NET中Web API参数绑定的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • .NET6在WebApi中使用日志组件log4net

    目录 1.安装依赖 2.配置文件 3.注册组件 4.使用 1.安装依赖 Microsoft.Extensions.Logging.Log4Net.AspNetCore 2.配置文件 <?xml version="1.0" encoding="utf-8" ?> <configuration> <!-- This section contains the log4net configuration settings --> <

  • ASP.NET Core Web API 教程Project Configuration

    目录 1. 创建新项目 2. launchSettings.json 文件 3. Program.cs 和 Startup.cs 4. 扩展方法和 CORS 配置 5. IIS 配置 6. Startup 类中的其它代码 7. 基于环境的设置 前言: 本系列文章主要参考了<Ultimate ASP.NET Core 3 Web API>一书,对原文进行了翻译,同时适当删减.修改了一部分内容. 对于某些概念和原理,原书和本文中都没有进行详细描述,如果一一详细介绍,内容就显得臃肿且混乱,我个人是先

  • 使用Visual Studio创建ASP.NET Web API项目

    在本篇文章中将讲解如何使用Visual Studio创建一个新的ASP.NET Web API项目. 在VisualStudio中有两种方式用于创建WebAPI项目: 1.创建带MVC的WebAPI项目. 2.创建独立的WebAPI项目. 一.创建带MVC的WebAPI项目 在示例程序中使用的是VisualStudio 2013版本,创建一个新的WebAPI项目并且带MVC的模板,它包含了所有必要的引用. 1.选择“文件”->“新建”->“项目”,截图如下所示: 2.在弹出的新建项目窗口中,左

  • .NET6自定义WebAPI过滤器

    1.上代码 /// <summary> /// API白名单过滤器 /// </summary> public class APIFilter : ActionFilterAttribute { /// <summary> /// 控制器中加了该属性的方法中代码执行之前该方法. /// 所以可以用做权限校验. /// </summary> /// <param name="context"></param> pub

  • .NET6使WebApi获取访问者IP地址

    Program.cs文件中 //获取IP使用 builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); Controller中 private readonly IHttpContextAccessor httpContextAccessor; public YangController(IHttpContextAccessor _httpContextAccessor) { httpContextA

  • 使用最小 WEB API 实现文件上传会遇到的坑

    目录 前言: 一.实现代码 二.允许ContentType 三.惊现BUG 四.解决方案 结论: 前言: 在 .NET 6 之前,实现文件上传功能十分简单: [HttpPost("upload")] public async Task<IActionResult> Upload(IFormFile file) {     //对file执行操作     return Ok(file.FileName); } 但是,当使用 .NET 6 的最小 WEB API 来实现相同功能

  • 使用最小 WEB API 实现文件上传的Swagger支持

    目录 前言: 一.允许ContentType 二.自定义OperationFilter 前言: 上回,我们使用最小 WEB API 实现文件上传功能<​ ​使用最小 WEB API 实现文件上传会遇到的坑​​>,虽然客户端访问是正常的,但是当打开 Swagger 页面时,发现是这样的: 没法使用 Swagger 页面测试. 一.允许 Content Type 正常的 Swagger 页面应该是这样的: 看来,我们需要指定 Content Type: app.MapPost("/upl

  • ASP.NET中Web API的参数绑定

    在这篇文章中,我们将学习WebAPI如何将HTTP请求数据绑定到一个操作方法的参数中. 操作方法在WebAPI控制器中可以有一个或多个不同类型的参数.它可以是基本数据类型或复杂类型.WebAPI根据URL的查询字符串或请求主体中参数类型来绑定操作方法的参数. 如果参数类型是基本数据类型(int,double,string,DateTime,bool等),WebAPI默认将会从URL中获取参数值(即通过querystring)获取. 如果参数类型的复杂类型,WebAPI默认从请求主体中获取参数值.

  • ASP.NET中Web API解决跨域问题

    一.什么是跨域问题 跨域:指的是浏览器不能执行其他网站的脚本.是由浏览器的同源策略造成的,是浏览器施加的安全限制.(服务端可以正常接收浏览器发生的请求,也可以正常返回,但是由于浏览器的安全策略,浏览器不能处理服务端的返回). 那么什么是同源策略呢? 同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS.CSFR等攻击.所谓同源是指"协议+域名+端口"

  • ASP.NET中Web API的简单实例

    一.Web API的路由 1.在Visual Studio中新建MVC4项目,在App_Start目录下有一个WebApiConfig.cs文件,这个文件中就是相应的Web API的路由配置了. 2.Web API 框架默认是基于 Restful 架构模式的,与ASP.NET MVC 有区别的是,它会根据 Http 请求的 HttpMethod(Get.Post.Put.Delete)来在Controller 中查找 Action,规则是:Action 名中是否以Get.Post 开头?Acti

  • 详解如何在ASP.NET Core Web API中以三种方式返回数据

    在 ASP.NET Core 中有三种返回 数据 和 HTTP状态码 的方式,最简单的就是直接返回指定的类型实例,如下代码所示: [ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { [HttpGet] public IEnumerable<WeatherForecast> Get() { var rng = new Random()

  • 在IIS上部署ASP.NET Core Web API的方法步骤

    对于本文,我想与您分享有关如何在IIS上部署ASP.NET Core Web API的指南.我将指导您安装Visual Studio 2019,.NET Core Runtime 3.0.我还确保我逐步引导您在服务器(Web IIS)中启用它,使用no受管代码选项创建新的应用程序池,创建ASP.NET Core Web API项目以及发布ASP.NET Core Web API. 了解并遵循正确的步骤来准备开发和部署环境后,在IIS上部署ASP.NET Core Web API就是一件容易的事.

  • 详解ASP.NET Core Web Api之JWT刷新Token

    前言 如题,本节我们进入JWT最后一节内容,JWT本质上就是从身份认证服务器获取访问令牌,继而对于用户后续可访问受保护资源,但是关键问题是:访问令牌的生命周期到底设置成多久呢?见过一些使用JWT的童鞋会将JWT过期时间设置成很长,有的几个小时,有的一天,有的甚至一个月,这么做当然存在问题,如果被恶意获得访问令牌,那么可在整个生命周期中使用访问令牌,也就是说存在冒充用户身份,此时身份认证服务器当然也就是始终信任该冒牌访问令牌,若要使得冒牌访问令牌无效,唯一的方案则是修改密钥,但是如果我们这么做了,

  • asp.net中使用cookie传递参数的方法

    本文实例讲述了asp.net中使用cookie传递参数的方法.分享给大家供大家参考.具体如下: //传值 HttpCookie cookie = new HttpCookie("mycookie"); cookie.Value = "cookie值"; Response.AppendCookie(cookie); Response.Redirect("index.aspx"); //接收 Request.Cookies["mycooki

  • 详解Spring Boot Web项目之参数绑定

    一.@RequestParam 这个注解用来绑定单个请求数据,既可以是url中的参数,也可以是表单提交的参数和上传的文件 它有三个属性,value用于设置参数名,defaultValue用于对参数设置默认值,required为true时,如果参数为空,会报错 好,下面展示具体例子: 首先是vm: <h1>param1:${param1}</h1> <h1>param2:${param2}</h1> 好吧,就为了展示两个参数 第一种情况: @RequestMa

  • ASP.NET(C#) Web Api通过文件流下载文件的实例

    下载文件到本地是很多项目开发中需要实现的一个很简单的功能.说简单,是从具体的代码实现上来说的,.NET的文件下载方式有很多种,本示例给大家介绍的是ASP.NET Web Api方式返回HttpResponseMessage下载文件到本地.实现的方法很简单,其中就是读取服务器的指定路径文件流,将其做为返回的HttpResponseMessage的Content.直接贴出DownloadController控件器的代码: using System; using System.Collections.

随机推荐