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

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

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

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

下表列出了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)Web API常规的方法有四个:Get(),Post(),Put()和Delete()。

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

(3)可以将四种方法的参数传递归为两大类,而这两大类又集中在Get和Post中体现(Put是Get和Post的组合,Delete和Get类型),所以说研究Web API的参数绑定,只需要研究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=,
Name="Tom",
Age=,
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

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

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

例如下面的Get方法

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

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

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

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

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

Web API(四):Web API参数绑定的更多相关文章

  1. SpringMVC第四篇【参数绑定详讲、默认支持参数类型、自定义参数绑定、RequestParam注解】

    参数绑定 我们在Controller使用方法参数接收值,就是把web端的值给接收到Controller中处理,这个过程就叫做参数绑定- 默认支持的参数类型 从上面的用法我们可以发现,我们可以使用req ...

  2. 细说 Web API参数绑定和模型绑定

    今天跟大家分享下在Asp.NET Web API中Controller是如何解析从客户端传递过来的数据,然后赋值给Controller的参数的,也就是参数绑定和模型绑定. Web API参数绑定就是简 ...

  3. springMVC学习(5)-参数绑定

    接着上一集,记录参数绑定的过程: springmvc中,接收页面提交的数据是通过方法形参来接收: 一.默认支持的类型: 在controller形参中添加如下类型的参数处理适配器会默认识别并进行赋值: ...

  4. Asp.Net Web API 2第十六课——Parameter Binding in ASP.NET Web API(参数绑定)

    导航 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html. 本文主要来讲解以下内容: ...

  5. ASP.NET Web API中的参数绑定总结

    ASP.NET Web API中的action参数类型可以分为简单类型和复杂类型. HttpResponseMessage Put(int id, Product item) id是int类型,是简单 ...

  6. Parameter Binding in ASP.NET Web API(参数绑定)

    Parameter Binding in ASP.NET Web API(参数绑定) 导航 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnbl ...

  7. Web API 入门三(参数绑定)

    学到现在,感觉到微软的.NET各种框架和模型基础大致都差不多,所以,这部分内容大致和MVC部分差不多.在学习参事绑定之前,我们肯定要知道Controller(即控制器)是啥干啥的. 其实,Contro ...

  8. .net core Web API参数绑定规则

    参数推理绑定 先从一个问题说起,微信小程序按照WebAPI定义的参数传递,Get请求服务器端可以正常接收到参数,但是Post请求取不到. Web API代码(.netcore 3.1)如下: [Htt ...

  9. 一张图说明 Web Api 参数绑定默认规则

    请求如下: 控制器如下: 慎重说明:不管请求方式是 get 还是 post , 简单类型的参数,如 name 和 id ,其值都是从 url 里面去取. Web API 从 url 还是 body 获 ...

随机推荐

  1. hadoop集群虚拟机配置

    hadoop_1, hadoop_2, hadoop_3 用户名riluo 密码19841984 查看Linux自带的JDK是否已安装 (卸载centOS已安装的1.4) 安装好的CentOS会自带O ...

  2. 常用jdbc操作

    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");   Connection con = DriverMa ...

  3. 超酷的Android 侧滑(双向滑动菜单)效果

    下面看看我们如何使用它,达到我们想要的效果 public class MainActivity extends Activity { /** * 双向滑动菜单布局 */ private SliderM ...

  4. python学习笔记013——推导式

    1 推导式简介 推导式comprehensions(又称解析式),是Python的一种独有特性. 推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 推导式有三种形式: 1)列表推导式 (li ...

  5. JMeter ----内置函数列表

    Jmeter有两种类型的函数: 用户定义的静态值(或变量) 内置函数 用户定义的静态值允许用户定义变量时被替换为静态的值测试树编译并提交运行.需要注意的是,变量目前无法嵌套,即${Var${N}}不起 ...

  6. PSQL_标准API和Interface基本的用法和比较(概念)

    2014-01-05 Created By BaoXinjian

  7. Unix环境高级编程(十六)进程间通信

    进程间通信(IPC)是指能在两个进程间进行数据交换的机制.现代OS都对进程有保护机制,因此两个进程不能直接交换数据,必须通过一定机制来完成. IPC的机制的作用: (1)一个软件也能更容易跟第三方软件 ...

  8. Linux 共享库(动态库)

    Linux 系统上有两类根本不同的 Linux 可执行程序.第一类是静态链接的可执行程序.静态可执行程序包含执行所需的所有函数 — 换句话说,它们是“完整的”.因为这一原因,静态可执行程序不依赖任何外 ...

  9. JS教程:window.location使用方法的区别

    介绍了window.location使用方法的区别. window.location.href=&http://www.jbxue.com/javascript/ldquo;url”:改变ur ...

  10. 【Android】21.2 2D图形图像处理(Canvas和Paint)

    分类:C#.Android.VS2015: 创建日期:2016-03-19 一.Canvas对象简介 画布(Canvas对象)是与System.Drawing或iOS核心图形等传统框架非常类似的另一种 ...