zoukankan      html  css  js  c++  java
  • 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实例对象的属性值,而不用去请求主体。

      

  • 相关阅读:
    mongdb aggregate聚合操作
    mongdb group聚合操作
    mongodb复制集
    springboot2.0数据制作为excel表格
    mongodb索引
    校招真题练习025 瞌睡(网易)
    校招真题练习024 牛牛的闹钟(网易)
    校招真题练习023 俄罗斯方块(网易)
    校招真题练习022 数对(网易)
    校招真题练习021 迷路的牛牛(网易)
  • 原文地址:https://www.cnblogs.com/czx1/p/6843498.html
Copyright © 2011-2022 走看看