ASP.NET4.5Web API及非同步程序開發系列(2)


認識ASP.NET WEB API

他的前身為WCF WEB API用於協助WCF支持RestFul。現在集成進ASP.NET,正式更名為ASP.NET WEB API,ASP.NET Web API是一個用來在.NET框架上建立web API的框架。

    • 支持利用HTTP協議在.NET FRAMEWORK建立HTTP服務
    • 協助客戶端程序利用GET/POST命令傳送XML/JSON文件進行呼叫並取回結果

很多大型網站都提供了WEB API 的功能,例如Facebook、Twitter、LinkedIn,以及Netflix等

 HTTP服務vs網頁

  HTTP不僅服務於web頁面。它也是建立暴露服務與數據的API(應用程序編程接口)的功能強大的平台。HTTP簡單、靈活且無處不在。幾乎你所能想到的任何平台都有一個HTTP庫,因此,HTTP服務能夠到達范圍廣泛的客戶端,包括瀏覽器、移動設備、以及傳統的桌面應用程序。

 

 ASP.NET4.5 WEB API的架構

 ASP.NET4.5 WEB API的架構的優點

  • 支持多種形態的客戶端,包括瀏覽器,智能手機,Windows應用程序,平板等
  • 非同步執行,具有更好的延展性最大限度的利用HTTP協議的優勢
  • Web API其實並不是輕量級的,但它只針對一個協議來支持API,它不會產生很多超重的包袱
  • Web API與ASP.NET MVC的密切集成

 

 

 

ASP.NET4.5 WEB API的功能

  •  HTTP程序設計模型:接受HTTP Request請求,回應HTTP Response
  • 內容格式的協調:默認的內容為XML,JSON,與URL編碼模式
  • 支持Restful
  • 模型綁定與驗證:依據HTTP Requst內容建立的對象,易於使用和驗證
  • 支持MVC Framework的路由機制
  • 支持Arrtibute(例如[Authorize])特性進行方法的控制
  •  易於單元測試:支持利用HTTPRequestMessage和HTTPResponseMessage類型進行單元測試
  • 支持 Service Locator Pattern:易於與IoC 容器或依賴注入框架進行整合,方便依賴性的管理
  • 彈性的宿主選擇:支持裝載在ASP.NET MVC網站,ASP.NET WEBFROM網站,或是Window應用程序中。

是不是發現,和我們之前學的MVC3知識點好相似,不錯,感覺就是一種平滑的過渡

 利用WEB API 建立HTTP服務

     學習WEBAPI我覺得重點是先熟悉他的路由,由於支持RestFul,所以很多時候模板給出的方法命名,以及路由的導向方式,讓很多人誤以為是很陌生的新技術,望而卻步。

 首先我們從MVC4 的WEB API模板自動創建的文件進行分析

namespace MyFristWebAPI.Controllers
{
    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)
        {
        }
    }
}

 

  方法名好有特色,GET,POST,PUT,DELETE,而且每個方法上面都給出了他的路由,為其指定了一個的Uri,好吧,如果你感覺到不習慣,我們就進行下面的解釋:

  WCF 很好的支持了 REST 的開發, 而 RESTful 的服務通常是架構層面上的考慮。 因為它天生就具有很好的跨平台跨語言的集成能力,幾乎所有的語言和網絡平台都支持 HTTP 請求,無需去實現復雜的客戶端代理,無需使用復雜的數據通訊方式既可以將我們的服務暴露給任何需要的人,無論他使用 VB、Ruby、JavaScript,甚至是 HTML FORM,或者直接在瀏覽器地址欄輸入。 
WCF 中通過 WebGetAttribute、WebInvokeAttribute (GET/PUT/POST/DELETE)、UriTemplate 定義 REST 的服務的調用方式, 通過 WebMessageFormat (Xml/Json) 定義消息傳遞的格式。

  REST屬於一種設計風格,REST POST(新增數據),GET(取得數據),PUT(更新數據),DELETE(刪除數據)來進行數據庫的增刪改查,而如果開發人員的應用程式符合REST原則,則它的服務為“REST風格Web服務“也稱的RESRful Web API”。

ASP.NET Web API 遵循着以下原則:

類型繼承了ApiController,有別於MVC 繼承自Controller
以MVC 的習慣配置原則,Web API 的Controller 也放在Controllers 數據夾內
預設URL 格式為localhost/api/{controller}/{id}
Action 皆以HTTP 動詞開頭Get、Post、Put、Delete

從Values​​Controller 可以看到,具備了前面說的CRUD 四種方法,而且在Action 中也不用使用[HttpGet]、[HttpPost] 等修飾,那究竟它是如何運作的呢?打個比喻,假設今天服務端收到了一個GET 請求時,會去查找對應的Controller 並且Action 以"Get..." 開頭的function ,EX:GetMembers、GetTime,以此類推,如果我們已jQuery Ajax 發出了一個POST 請求,也會自動對應到以"Post..." 開頭的Action 內,也就是說實際呼叫哪個Controller 的Action 不是利用網址來決定,而是依照HTTP 所送出的請求來決定,這也就是非常典型的REST-Style,而在Web API 中也處理了回傳的數據,讓我們看看Get() 這個方法,回傳IEnumerable<T> 的方法,等於我們擁有了強類型。

而在App_Star 文件夾內的WebApiConfig.cs ,定義了Web API 的路由設定,從路由上可以非常清楚看到,預設的URL 以從原本MVC 的/{controller}/{action}/{id} 改變為/api/{controller}/{id} 了,這也是前面說到的我們不再需要知道哪個Controller 對應到哪個Action 而是以HTTP 接收到的命令為主,如下:

 routes.MapHttpRoute(                 name: "DefaultApi",                  routeTemplate: "api/{controller}/{id}",                  defaults: new { id = RouteParameter.Optional }            );

 

 談完了路由后,我們就可以來寫一個簡單的Web API 了,首先可以建立一個ASP.NET MVC 4 的空白解決方案,當然要建立Web API 模板項目也可以,然后我們新增一個空白的AccountController:

 

 創建好后加入以下代碼:

public class AccountController : ApiController
    {
        public HttpResponseMessage RequestToken(string ConsumerKey, string ConsumerSecret)
        {
            return Request.CreateResponse(HttpStatusCode.OK);
        }

        public HttpResponseMessage AccessToken(string ConsumerKey, string Verifier)
        {
            return Request.CreateResponse(HttpStatusCode.OK);
        }
    }

 然后啟動Fiddler,按F5 啟動應用程式,此時瀏覽器會出現,但會顯示找不到網頁的訊息,畢竟我們使用的是Web API,理論上是不可能會有瀏覽器看得懂的HTML內容,所以我們可以到項目的屬性中,設定不啟動瀏覽器:

啟動完成后,我們按照/api/{controller} 的格式,去呼叫/api/account/RequestToken,會得到這樣的訊息:

結果發現這個方法是無效的,這是為什么?如果說我們使用的方法名稱不是 Get/Post/Put/Delete 的規則時,我們就一定要宣告它的接受動詞 (Accept Verb),所以我們可以修改如下代碼:

 public class AccountController : ApiController
    {
        [HttpGet]
        public HttpResponseMessage RequestToken(string ConsumerKey, string ConsumerSecret)
        {
            return Request.CreateResponse(HttpStatusCode.OK);
        }

        [HttpGet]
        public HttpResponseMessage AccessToken(string ConsumerKey, string Verifier)
        {
            return Request.CreateResponse(HttpStatusCode.OK);
        }
    }

 

然后我們再試一次,得到如下結果(訪問/api/account/RequestToken?ConsumerKey=abc&ConsumerSecret=123):

我們發現成功了同樣的方法測試另一個也成功了。

 

     未完待續....之后將對oData的支持,多媒體支持,Jquery調用WEB API等進行筆記總結。

     備注:我也是剛剛開始學習,參閱了很多前輩的文章,所以版權的歸大家所有,不歸本人所有,如果你喜歡本文的話,推薦共勉,謝謝!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM