學到現在,感覺到微軟的.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實例對象的屬性值,而不用去請求主體。