初始WebApi(2)

第一部分主要介紹了什麼是WebApi,以及它是幹什麼的,怎麼去調用後臺數據等等。。。javascript

今天就繼續來學習一個新的知識。在上一篇文章中主要是介紹了一下如何根據根據Ajax去調用後臺增刪改查的數據。java

那麼,難道咱們只能針對一個表的數據進行增刪改查的數據嗎?好比咱們要進行一個登錄操做,上傳照片等等。。。改怎麼去實現某一特定的業務需求呢?ajax

第一步:建立一個LoginViewModel類api

 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"的參數。post

這個參數有啥用呢?學習

我在Login方法上也作了一個[Route]的標識,注意在請求時要與[Route]設置的名稱爲主,不能和方法名爲主!!!url

這兩個組合在一塊兒就成了一個完整的路由,在調用時,能夠手動根據咱們本身建立的路由規則去調用後臺的數據。spa

上一篇文章中存在RESTful語義化風格的Get、post等必需要加方法名Get做爲前綴,否則沒法訪問。。。code

在這裏經過自定義路由規則就能夠解決這個「死板」的問題了。。

 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 }
相關文章
相關標籤/搜索