Web API 入门三(参数绑定)
学到现在,感觉到微软的.NET各种框架和模型基础大致都差不多,所以,这部分内容大致和MVC部分差不多。在学习参事绑定之前,我们肯定要知道Controller(即控制器)是啥干啥的。
其实,Controller(控制器)就是一个类,我们可以将它 放到项目根目录文件夹下的任何位置,当然,我们一般将它放到Controllers文件夹下(这是一个很好的习惯,因为这样方便管理,更方便以后的学习,在MVC中,有一个重要的规则:约定大于配置)。一个控制器类是个特殊类,类名必须以"Controller"结尾,并且必须继承于System.Web.Http.ApiController类,控制器中有大量的公共方法,即操作方法(公开接口)。
下面是我们创建Web Api项目时VS默认添加的简单Controller类:
- 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)
- {
- }
- }
我们可以发现,其中的pulic方法名字好像与HTTP动词(GET、POST、PUT、DELETE等)一样,我们知道Web Api仅仅支持HTTP,或许这就是原因吧。根据传入的请求URL和HTTP动词(GET / POST / PUT / PATCH / DELETE),Web API决定执行哪个Web API控制器和操作方法,如Get()方法将处理HTTP GET请求,POST()方法将处理HTTP POST请求,Put()方法将处理HTTP PUT请求,DELETE()方法将为上述Web API处理HTTP DELETE请求。
如果我们不想为我们的方法起这么死的名字,我们可以在我们方法加上相应的属性即可。如HttpGet HttpPost,HttpPut等等就像MVC控制器一样。
在了解Controller后,我们就想,如何进行参数绑定呢?下面我们继续学习。关于参数绑定问题,无非就是简单类型与复杂类型,单个参数与多个参数。Web API根据URL的查询字符串或请求主体中参数类型来绑定操作方法的参数。简单类型将会从querystring中获取,复杂类型参数,则Web Api默认将试图从请求主体获取值。下表列出默认情况下的绑定方式:
下面给出GET请求的例子:
- namespace WebApi.Controller
- {
- public class Student
- {
- public int id { get; set; }
- public string name { get; set; }
- public int age { get; set; }
- }
- public class HelloController : ApiController
- {
- static string connectStr = ConfigurationManager.ConnectionStrings["connectString"].ToString();
- public Student Get(int id)
- {
- Student stu = new Student();
- using (SqlConnection con = new SqlConnection(connectStr))
- {
- string sqlString = "select * from Student where id=" + id.ToString();
- SqlCommand com = new SqlCommand(sqlString, con);
- con.Open();
- SqlDataReader dr = com.ExecuteReader();
- if (dr.Read())
- {
- stu.id = id;
- stu.name = dr[1].ToString();
- stu.age = Convert.ToInt32(dr[2]);
- }
- }
- return stu;
- }
- }
- }
其实以下形式也是对的:http://localhost:15939/api/hello?id=2
http://localhost:15939/api/hello?ID=2
查询字符串参数名称和操作方法参数名称必须相同(不区分大小写)。名称不匹配的参数将不会赋值,参数的先后顺序没有要求。
在默认的情况下,Web API从查询字符串中得到基本类型参数的值,从请求主体中得到复杂类型参数的值。但是,我们也可以改变这种默认行为,这样我们就要用到FromURI和FromBody,使用[FromUri]属性,使Web API来从查询字符串中获取复杂类型的值,使用(FromBody)属性可以使Web API从请求主体获取原始类型的值。
- public class HelloController : ApiController
- {
- public Student Get([FromUri]Student stu)
- {
- return stu;
- }
- }
在此,我们使用了FromUri属性,当发起HTTP GET请求http://localhost:15939/api/hello?ID=2&name=sss&age=19时,Web Api将创建一个Student对象实例,然后从query string中获取id、name和age数据并将数据复制给Student对象实例,这样Web Api将从query string中提取Student实例对象的属性值,而不用去请求主体。
Web API 入门三(参数绑定)的更多相关文章
- ASP.NET Web API中的参数绑定总结
ASP.NET Web API中的action参数类型可以分为简单类型和复杂类型. HttpResponseMessage Put(int id, Product item) id是int类型,是简单 ...
- <SpringMvc>入门三 参数绑定
1.get请求 <%--请求参数的绑定--%> <%--get请求参数--%> <a href="/param/testParam1?username=tom& ...
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
Redis总结(五)缓存雪崩和缓存穿透等问题 前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...
- Web API 入门指南 - 闲话安全
Web API入门指南有些朋友回复问了些安全方面的问题,安全方面可以写的东西实在太多了,这里尽量围绕着Web API的安全性来展开,介绍一些安全的基本概念,常见安全隐患.相关的防御技巧以及Web AP ...
- 转载-Web API 入门
An Introduction to ASP.NET Web API 目前感觉最好的Web API入门教程 HTTP状态码 Web API 强势入门指南 Install Mongodb Getting ...
- Web API入门指南(安全)转
安全检测的工具站点:https://www.owasp.org/index.php/Category:Vulnerability_Scanning_Tools Web API入门指南有些朋友回复问了些 ...
- 【ASP.NET Web API教程】1 ASP.NET Web API入门
原文 [ASP.NET Web API教程]1 ASP.NET Web API入门 Getting Started with ASP.NET Web API第1章 ASP.NET Web API入门 ...
- Web API 入门指南
Web API 入门指南 - 闲话安全2013-09-21 18:56 by 微软互联网开发支持, 231 阅读, 3 评论, 收藏, 编辑 Web API入门指南有些朋友回复问了些安全方面的问题,安 ...
- (转)Web API 入门指南 - 闲话安全
原文地址:http://www.cnblogs.com/developersupport/p/WebAPI-Security.html Web API入门指南有些朋友回复问了些安全方面的问题,安全方面 ...
随机推荐
- 自定义过滤器-vue
1.自定义过滤器名与内置过滤器冲突,则内置的会被覆盖:后注册的过滤器与前注册的冲突,则之前的会被覆盖 2.自定义过滤器 1)单参数 2)多参数 3
- Python---协程---重写多线程
一. # 用协程的方式,修改播放电影和音乐的练习题 # 用协程的方式完成播放 movie_list = ["斗破.mp4", "复仇者联盟.avi", &quo ...
- 华为云服务器centos7.3 安装jdk
1. 进入oracle官网 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 服 ...
- dnsmasq+Stunnel+sniproxy加密代理
一.环境介绍 [root@kimissVPN ~]# cat /etc/redhat-release CentOS release 6.8 (Final) [root@kimissVPN ~]# un ...
- DI,依赖注入,给对象赋值 ,get,set,list,set,map,properties对象赋值
- 一篇面试的考题----jQuery
一.jQuery测试题 下面哪种不是jquery的选择器?(单选)A.基本选择器 B.后代选择器 C.类选择器 D.进一步选择器考点:jquery的选择器 (C) 当DOM加载完成后要执行的函数,下面 ...
- 一本通&&洛谷——P1120 小木棍 [数据加强版]——题解
题目传送 一道特别毒瘤能提醒人不要忘记剪枝的题. 首先不要忘了管理员的话.忘把长度大于50的木棍过滤掉真的坑了不少人(包括我). 显然是一道DFS题 .考虑剪枝. 找找搜索要面临的维度.状态:原始木棍 ...
- I - Rake It In
题目链接:https://nanti.jisuanke.com/t/A1538 题意:给一个4*4的方阵,k个回合,a和b轮流选一个2*2的矩阵和,a要使和最大,b要使和最小,选完后2*2矩阵要逆时针 ...
- 从Java 调用JavaScript
篇幅过长 下载资源链接https://www.slidestalk.com/s/java_javascript_5hl09w
- java 中 进程和线程的区别
目录 什么是进程?什么是线程? 为什么要有线程? 进程与线程的区别? 进程与线程的选择取决条件? 什么是进程?什么是线程?进程:进程是并发执行程序在执行过程中资源分配和管理的基本单位(资源分配的最小单 ...