第一部分主要介紹了什麼是WebApi,以及它是乾什麼的,怎麼去調用後臺數據等等。。。 今天就繼續來學習一個新的知識。在上一篇文章中主要是介紹了一下如何根據根據Ajax去調用後臺增刪改查的數據。 那麼,難道我們只能針對一個表的數據進行增刪改查的數據嗎?比如我們要進行一個登陸操作,上傳照片等等。。。改怎 ...
第一部分主要介紹了什麼是WebApi,以及它是乾什麼的,怎麼去調用後臺數據等等。。。
今天就繼續來學習一個新的知識。在上一篇文章中主要是介紹了一下如何根據根據Ajax去調用後臺增刪改查的數據。
那麼,難道我們只能針對一個表的數據進行增刪改查的數據嗎?比如我們要進行一個登陸操作,上傳照片等等。。。改怎麼去實現某一特定的業務需求呢?
第一步:創建一個LoginViewModel類
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 6 namespace Demo.Models 7 { 8 public class LoginViewModel 9 { 10 public string LoginName { get; set; } 11 public string LoginPwd { get; set; } 12 } 13 }
第二步:創建User控制器
可以看到有一個[RoutePrefix]的標識,實際上之所以能夠標識也是一個特性類的作用,並且我寫了一個"api/User"的參數。
這個參數有啥用呢?
我在Login方法上也做了一個[Route]的標識,註意在請求時要與[Route]設置的名稱為主,不能和方法名為主!!!
這兩個組合在一起就成了一個完整的路由,在調用時,可以手動根據我們自己創建的路由規則去調用後臺的數據。
上一篇文章中存在RESTful語義化風格的Get、post等必須要加方法名Get作為首碼,不然無法訪問。。。
在這裡通過自定義路由規則就可以解決這個“死板”的問題了。。
1 using Demo.Models; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Net; 6 using System.Net.Http; 7 using System.Web.Http; 8 9 namespace Demo.Controllers 10 { 11 //WebApi:只管處理數據 12 13 //在控制器上方加一個路由首碼來確定請求的一個控制器 RoutePrefix Prefix意為首碼 14 [RoutePrefix("api/User")] 15 public class UserController : ApiController 16 { 17 //此處沒有Restful風格語義化 所以需要自己手動指定此處需要什麼樣的請求 18 [HttpPost] 19 //定義一個路由名稱為 Login,即RouteName,這時,它會和首碼組合成一個完整的路由 20 [Route("Login")] 21 public string Login(LoginViewModel model) 22 { 23 return "Ok"; 24 } 25 [HttpGet] 26 [Route("Messages")] 27 public IHttpActionResult GetMessage() 28 { 29 return Ok(new Student() { 30 Id=80, 31 Name="及格了" 32 }); 33 } 34 35 } 36 37 }
例如:
Html代碼段部分:
這裡我就只寫ajax部分的代碼了,其他Html標簽就不多贅述了。。。
主要是看url請求的地址:/api/User/Login
1 <script type="text/javascript"> 2 $.ajax({ 3 url: "/api/User/Login", 4 type: "post", 5 data: { 6 LoginName: "admin", 7 LoginPwd: "123" 8 9 } 10 <script>
當然了,它也可以作為一個對象傳遞給客戶端。GetMessage()方法裡面
在這裡創建了一個學生類:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 6 namespace Demo.Models 7 { 8 public class Student 9 { 10 public int Id { get; set; } 11 public string Name { get; set; } 12 } 13 }
那怎麼去理解IHttpActionResult呢?
IHttpActionResult:可以看到它是一個介面,介面代碼:返回結果是HttpResponesMessage的任務。我可不可以認為這是後臺數據在傳遞到客戶端是,返回的狀態碼?一個狀態碼代表一個返回結果。
比如
return Ok() 狀態碼:200
NotFound() 狀態碼:404
return InternalServerError(new Exception("你錯了")) 狀態碼:500
實際上這些方法都只能在IHttpActionResult中實現的。
想想介面中一般是有一個類,幾個方法
如果需要驗證的話可以去試試F12看看NetWork裡面是否該方法對應了自己的狀態碼
正是該方法實現了該介面,所有才可以進行處理。
那麼這裡需要註意的是只有 Return Ok(),才能帶數據到客戶端。。。
1 using System.Net.Http; 2 using System.Threading; 3 using System.Threading.Tasks; 4 5 namespace System.Web.Http 6 { 7 // 8 // 摘要: 9 // 定義一個用於以非同步方式創建 System.Net.Http.HttpResponseMessage 的命令。 10 public interface IHttpActionResult 11 { 12 // 13 // 摘要: 14 // 以非同步方式創建 System.Net.Http.HttpResponseMessage。 15 // 16 // 參數: 17 // cancellationToken: 18 // 要監視的取消請求標記。 19 // 20 // 返回結果: 21 // 在完成時包含 System.Net.Http.HttpResponseMessage 的任務。 22 Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken); 23 } 24 }
User控制器:在這裡的請求方式是Get,因為做了一個[HttpGet]的標識
1 using Demo.Models; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Net; 6 using System.Net.Http; 7 using System.Web.Http; 8 9 namespace Demo.Controllers 10 { 11 //WebApi:只管處理數據 12 13 //在控制器上方加一個路由首碼來確定請求的一個控制器 RoutePrefix Prefix意為首碼 14 [RoutePrefix("api/User")] 15 public class UserController : ApiController 16 { 17 //此處沒有Restful風格語義化 所以需要自己手動指定此處需要什麼樣的請求 18 [HttpPost] 19 //定義一個路由名稱為 Login,即RouteName,這時,它會和首碼組合成一個完整的路由 20 [Route("Login")] 21 public string Login(LoginViewModel model) 22 { 23 return "Ok"; 24 } 25 [HttpGet] 26 [Route("Messages")] 27 public IHttpActionResult GetMessage() 28 { 29 return Ok(new Student() { 30 Id=80, 31 Name="及格了" 32 }); 33 } 34 35 } 36 }