1. 程式人生 > >Web API 入門三(參數綁定)

Web API 入門三(參數綁定)

int src bsp 類型參數 參數類型 font 重要 class microsoft

  學到現在,感覺到微軟的.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 入門三(參數綁定)