ASP.NET Web API 簡介

ASP.NET MVC 4 包含了 ASP.NET Web API, 這是一個建立能夠鏈接包括瀏覽器、移動設備等多種客戶端的 Http 服務的新框架, ASP.NET Web API 也是構建 RESTful 服務的理想平臺。
ASP.NET Web API 特性
ASP.NET Web API 包含下列特性:
先進的 HTTP 編程模型:
使用新的強類型的 HTTP 對象模型直接操做 HTTP 請求和響應, 在 HTTP客戶端使用相同的編程模型和 HTTP 管道;

支持路由:
Web API 完整支持 ASP.NET 路由, 包括路由參數和約束。 此外, 到動做的映射支持約定, 今後將再也不須要向類或者方法添加相似於 [HttpPost] 之類的屬性;

內容協商:
客戶端與服務端能夠一塊兒決定 API 返回數據的格式。 默認支持 XML, JSON 以及 Form URL-Encoded 格式, 能夠擴展添加自定義格式, 甚至能夠替換掉默認的內容協商策略;

模型綁定與驗證:
模型綁定器能夠輕易地從 HTTP 請求中提取數據並轉換成在動做方法中使用的 .Net 對象;
過濾:
Web API 支持過濾, 包括總所周知的 [Authorize] 過濾標記, 能夠爲 Action 添加並插入自定義過濾, 實現認證、異常處理等;

查詢聚合:
只要簡單的返回 IqueryableT , Web API 將會支持經過 OData 地址約定進行查詢;

改進的 Http 細節可測試性:
Web API 不是將 HTTP 細節設置到一個靜態的 Context 對象上, 而是使用 HttpRequestMessage 和 HttpResponseMessage 實例, 可使用這些對象的泛型版本爲這些 Http 類型添加自定義類型;
改進的依賴反轉 (IoC) 支持:
Web API 使用 MVC Dependency Resolver 實現的服務定位器模式在不一樣的場景下來獲取實例;

基於代碼的配置:
Web API 單獨使用代碼完成配置, 從而保證了配置文件的整潔;

自託管 (Self-Host) :
Web API 除了能夠託管在 IIS 中, 還能夠託管在進程中,依舊可使用路由以及其它的特性。

第一個 Web API 程序
從零開始建立 Web API 項目
一、 建立一個空的 ASP.NET 4.0 網站項目
Untitled picture
二、 添加對 System.Net.Http , System.Net.Http.Formatting , System.Web.Http , System.Web.Http.Common , System.Web.Http.WebHost 的引用
using 三、 添加 Global Application Class , 並在 Global 類中的 Application_Start 方法中添加以下代碼: RouteTable.Routes.MapHttpRoute( name: DefaultApi, routeTemplate: api/{controller}/{id}, defaults: new { id = RouteParameter.Optional } ); 四、添加一個 ProductsController , 繼承自 ApiController , 代碼以下: public class ProductController : ApiController { public IQueryable GetAllProducts() { ... } public Product GetProductById(int id) { ... } } 五、 在瀏覽器輸入 URI 訪問資源, 也能夠經過腳本等任何客戶端進行訪問, 以瀏覽器爲例: 在地址欄輸入 http://localhost:64334/api/products 將會訪問到 GetAllProducts 方法, 返回全部的 Product 實例; 在地址欄輸入 http://localhost:64334/api/products /1 將會訪問到 GetProductById 方法, 返回指定 id 的 Product 實例; 理解 API 路由 對於每個 Http 消息, ASP.NET Web API 框架經過路由表決定由哪一個控制器處理請求。 當你建立一個新的 Web API 項目時, 將會包含一個相似這樣的一個默認的路由: /api/{controller}/{id} {controller} 和 {id} 是兩個佔位符, 當遇到一個符合這種樣式的 URI , 將將會開始尋找合適的控制器方法進行調用, 規則以下: {controller} 用來與控制器名稱像匹配; HTTP 請求的方法用來與方法名稱匹配; (本規則只適用於 GET, POST, PUT 和 DELETE) {id} , 若是有, 將會用於和方法的 id 參數進行匹配; 這裏有一些請求的例子, 以及基於當前實現狀況的的 HTTP 動做結果: HTTP Method URI Action GET /api/products GetAllProducts GET /api/products/5 GetProduct(5) POST /api/products HTTP Status 405 GET /api/users/ HTTP Status 404 在第一個例子中, 與 products 相匹配的是 ProductsController , HTTP 請求的方法是 GET , 因此框架開始在 ProductController 類裏面尋找以 「Get」 開頭的方法, 此外, URI 中沒有提供 id 參數, 因此框架要找一個沒有參數的方法, 最後, ProductsController 的 GetAllProducts 方法知足要求。 第二個例子與第一個相似, 不一樣的是 URI 裏面包含了 {id} 參數。 所以, 框架調用 GetProduct 方法, 由於它須要一個名稱爲 id 參數。 值得注意的是, URI 裏面的 id 參數是字符串類型的 「5」 , 框架會根據方法的簽名自動把它轉換成×××。 在第三個例子中, 客戶端發起 HTTP Post 請求, 框架尋找名稱以 「Post」 開始的方法。 而 ProductController 類沒有這樣的方法, 因此框架返回的 HTTP 狀態碼是 405 , 表示不容許調用的方法 (Method Not Allowed) 。 再看第四個例子, 客戶端發送一個 GET 請求到 /api/users 。 框架尋找名稱爲 UserController 的控制器, 這樣的類尚未定義, 因此框架返回的 HTTP 狀態碼是 404 , 表示請求的資源未找到。 Web API CURD 什麼是 CURD CURD 是指 Create 、 Update 、 Read 、 Delete 四個簡單的數據庫操做, 一般大多數 Web 服務也經過 REST 風格的服務提供這些操做。 接下來將繼續完善 ProductsController 以支持下面全部的操做: 動做 HTTP 方法 相對路徑 獲取所有 GET /api/products 指定 id 獲取 GET /api/products/id 添加 POST /api/products 更新 PUT /api/products/id 刪除 DELETE /api/products/id 資源 ProductController 提供了兩種 URI 資源: 資源 地址 所有產品列表 /api/products 單個產品 /api/products/id HTTP 的四個主要方法 (GET, PUT, POST, DELETE) 按照下列方式映射爲 CURD 操做: GET 用於獲取 URI 資源的進行展現, GET 操做不該對服務端有任何影響; PUT 用於更新 URI 上的一個資源, 若是服務端容許, PUT 也能夠用於新建一個資源; POST 用於新建 資源, 服務端在指定的 URI 上建立一個新的對象, 將新資源的地址做爲響應消息的一部分返回; DELETE 用於刪除指定的 URI 資源。 實現 CURD 新建資源 客戶端發起 HTTP POST 請求新建資源, 爲了能處理 POST 請求, 須要在 ProductController 定義一個以 Post 開頭的方法, 這個方法接受一個類型爲 Product 的參數。 根據 HTTP/1.1 協議, 須要注意的問題有: 響應代碼: Web API 默認返回的響應代碼是 200 (OK) , 可是根據 HTTP/1.1 協議, POST 請求並建立資源的響應代碼應該是 201 (Created); 地址: 當服務器建立資源以後, 應該在響應的 Header 裏面包含新資源的地址。 新建資源的最終代碼以下: public HttpResponseMessage PostProduct(Product product) { this._dbContext.Save(product); var result = new HttpResponseMessage(product, HttpStatusCode.Created); var location = Url.Route(null, new { id = product.ProductID }); result.Headers.Location = new Uri(location); return result; } 更新資源內容 更新是比較簡單的, 代碼以下: public HttpResponseMessage PutProduct(int id, Product product) { if (!this._dbContext.Products.Any(p = p.ProductID == id)) { throw new HttpResponseException(HttpStatusCode.NotFound); } product.ProductID = id; this._dbContext.Update(product); return new HttpResponseMessage(HttpStatusCode.OK); } 該方法須要兩個參數, id 從 URI 中獲取, product 從客戶端請求消息中獲取。 刪除資源 根據 HTTP 協議, 刪除應當是冪等的, 也就是說一個 URI 上接受到多少個刪除請求都是相同的, 若是資源已經被刪除, 也不能返回錯誤的響應代碼。 若是成功刪除了資源, 能夠返回 200 (OK) 響應代碼, 以及一個實體進行狀態說明, 或者返回 204 (No Content)。 若是刪除須要等待事務完成, 則應該返回 202 (Accepted) 。 刪除資源的實現代碼以下: public HttpResponseMessage DeleteProduct(int id) { var product = this._dbContext.Products.FirstOrDefault(p = p.ProductID == id); this._dbContext.Delete(product); return new HttpResponseMessage(HttpStatusCode.NoContent); }
相關文章
相關標籤/搜索