什麼 Web API 呢?所謂的 Web API 其實就是一種建立在 RESTful 服務基礎上的平台,當然一定是走 HTTP 的協定。當您建立好一個空的 Web API 的 MVC 專案後,在 Controller 中你會發現一個新的類別 ApiController
ASP.NET MVC 4 終於在 2012/2/15 前進到 Beta 版了,在 Beta 中 [範本] 又多了兩個新的成員:Web API 、Single Page Application,如下畫面:
而在 Web API 與 Single Page Application 之中,目前 View 只支援 Razor 語法。什麼 Web API 呢?所謂的 Web API 其實就是一種建立在 RESTful 服務基礎上的平台,當然一定是走 HTTP 的協定。當您建立好一個空的 Web API 的 MVC 專案後,在 Controller 中你會發現一個新的類別 ApiController,預設,它 (很範例的) 先幫你實作了 Get(), Post(), Put(), Delete() 等方法,其中 Get() 有一個是 Overloading 傳回 IEnumerable<T> 的方法,這也是 Web API 最主要也是最強大的特性之一,強行別的 HttpWebRequest。空的專案幫你建立好的 ApiController 程式碼如下:
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Net.Http;
5: using System.Web.Http;
6:
7: namespace MvcWebAPIApplication1.Controllers
8: {
9: public class ValuesController : ApiController
10: {
11: // GET /api/values
12: public IEnumerable<string> Get()
13: {
14: return new string[] { "value1", "value2" };
15: }
16:
17: // GET /api/values/5
18: public string Get(int id)
19: {
20: return "value";
21: }
22:
23: // POST /api/values
24: public void Post(string value)
25: {
26: }
27:
28: // PUT /api/values/5
29: public void Put(int id, string value)
30: {
31: }
32:
33: // DELETE /api/values/5
34: public void Delete(int id)
35: {
36: }
37: }
38: }
在 Global.asax.cs 中在 routes 多了一個 MapHttpRoute() 的擴充方法,多註冊了 "api/{controller}/{id}" 的這個路徑
眼尖的人應該會發現在 Application_Start() 的地方多了一行 BundleTable.Bundles.RegisterTemplateBundles() ,它也是MVC 新的特性之一,不過他主要補助於 Web API 在HTTP 中傳輸 JavaScript 或 CSS 的時候,它會幫您一除掉一些不必要 [字元] 與 [空白] 以及一些最佳化的工作以提升傳輸效率。
它另一個特性就是它是可以獨立出來,掛入 Win32Services 或 Console 應用程式中,獨立的提供 Web API 服務。在這一版的 MVC 中另外新增了 HttpHostSelfConfiguration 類別來完成服務的公開。如果你建立一個 Console Application 專案,並撰寫如下程式便可以將你的 ApiController 公開出來,如下:
1: var config = new HttpSelfHostConfiguration("http://localhost:8080");
2: config.Routes.MapHttpRoute(
3: "API Default", "api/{controller}/{id}",
4: new { id = RouteParameter.Optional });
5: using (HttpSelfHostServer server = new HttpSelfHostServer(config))
6: {
7: server.OpenAsync().Wait();
8: Console.WriteLine("Press Enter to quit.");
9: Console.ReadLine();
10: }
既然是可以獨立出來,表示你可以獨立的存取它,你可以試試開另一個瀏覽器,輸入 http://localhost:7777/api/Values/1 的URL,在我們前面的 MvcWebApiApplication1 專案中應該可以取得 Get(id) 方法傳回的 "value"字串:
最後整理:
在 ASP.NET Web API 中共有以下幾個特性:
Modern HTTP programming model:
最強大的功能之一,前面提到過,它可以在 HttpWebRequest 中公開強行別的資料
Full support for routes:
它也是 Route 基礎下,因此支援 MVC 所有功能,如 [HttpPost] 等 Attributes 。
Content negotiation:
它的 Client 與 Server 使用共同的 API 與資料格式,預設支援 JSON、XML 等。當然您也可以在這個基礎上開發自己的資料傳輸格式。
Model binding and validation:
在模型繫結中使用強行別 HttpWebRequest 的資料,使用上更容易。
Filters: 如同 MVC 基本功能一樣,支援動作、驗證的過濾等動作,以及錯誤處理的部分。
Query composition:
它可公開如 IQueryable<T> 可查詢的介面。也支援 OData 協定。
Improved testability of HTTP details:
在這個平台上,HTTP的行細資訊、Context 物件等動作,現在多了HttpRequestMessage 與 HttpResponseMessage 這兩個執行個體物件。就是透過它使您可以在 HttpWebRequest 中傳遞自定的型別。
Improved Inversion of Control (IoC) via DependencyResolver:
如同 MVC 的架構上,你很容易實現 IoC 的設計模式。
Code-based configuration:
設定 Web API 的相關功能只要使用幾行 Code 就可以了,不需要修改任何 Configuration 檔案的內容。
Self-host: 前面有提到過了,Web API 的服務的部分是允許獨立出來進行服務的。稱為 Self-Host。
相關參考資料:
ASP.NET MVC 4 Beta
Getting Started with ASP.NET Web API
Introducing ASP.NET MVC 4 Beta with Web APIs
Bundling and Minification in ASP.NET MVC 4
http://www.dotnetexpertguide.com/2011/12/bundling-and-minification-aspnet-mvc4.html
Self-Host a Web API (C#)
http://www.asp.net/web-api/overview/hosting-aspnet-web-api/self-host-a-web-api
簽名:
學習是一趟奇妙的旅程
這當中,有辛苦、有心酸、也有成果。有時也會有瓶頸。要能夠繼續勇往直前就必須保有一顆最熱誠的心。
軟體開發之路(FB 社團):https://www.facebook.com/groups/361804473860062/
Gelis 程式設計訓練營(粉絲團):https://www.facebook.com/gelis.dev.learning/
如果文章對您有用,幫我點一下讚,或是點一下『我要推薦』,這會讓我更有動力的為各位讀者撰寫下一篇文章。
非常謝謝各位的支持與愛護,小弟在此位各位說聲謝謝!!! ^_^