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

Halower發表於2013-07-17

認識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等進行筆記總結。

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

 

相關文章