天天看點

Asp.Net Web API 2第二課——CRUD操作

Asp.Net Web API 導航

前言

  CRUD代表着 Create、Read、Update、Delete,這是四個基本的資料庫操作。許多HTTP服務模型也通過Rest或者Rest-like APIs實作CRUD操作。   

    在本教程中,我将建立一個非常簡單的Web API來管理一個産品清單,和第一課中的Model是一樣的,同樣每個産品包括名稱、價格和類别(如玩具或硬碟),在加上一個産品的ID。

  本次教程的開發工具使用的仍然是VS2013。

  這個産品的API将包含如下幾個方法。

Asp.Net Web API 2第二課——CRUD操作

這個産品的API定義了兩個資源類型的Uri

Asp.Net Web API 2第二課——CRUD操作

這四個主要的 HTTP 方法(GET、PUT、POST 和 DELETE)可以映射到以下的 CRUD 操作:

 GET就是在指定的URI中檢索資源的表現形式。get在伺服器段不會有任何的影響。

 PUT就是在指定的URI中更新一個資源。如果服務端允許用戶端指定新的URIs,那麼PUT在一個指定的URI中也能被用來建立一個新的資源。對于本教程,針對PUT的API将不能建立新資源。

 POST就是建立一個新的資源。服務端将配置設定給新對象一個URI,并且傳回這個URI響應消息的一部分。

 DELETE 就是在指定的URI中删除一個資源。

請注意:其中的PUT方法将替換掉産品的整個實體。也就是說,用戶端被期望發送一個完整的被更新産品實體資訊。如果你想支援部分更新,這個PATCH方法可以被選擇。在本教程中,PATCH方法将不會得到支援。

建立一個新的 Web API項目

 關于建立項目,如果您不太清楚,可以檢視第一課中相關内容介紹,當然本教程建立的項目和上一課中的又有所差別。

Asp.Net Web API 2第二課——CRUD操作

添加一個Model

 這個模型和上一次課程中的也是保持一緻。

直接上代碼

添加一個Repository

   首先我們需要存儲産品的集合。分開收集我們的服務實作是一個好的主意。這種方式,我們可以改變後備存儲,而不用修改服務類的實作。這種模式的設計叫做倉儲模式。首先建立一個接口。

暫時我們把接口和實體類放在了一個檔案夾下。現在在Models檔案夾下添加另外一個類,這個類将內建IProductRepository接口。

添加一個Web  API控制器

 如果你已經使用過Asp.Net MVC,那麼你已經很熟悉控制器了。在Asp.Net Web API,一個控制器就是一個處理來自用戶端的HTTP請求的一個class。

 有關如何添加控制器的也可以參見第一課中的内容,在這裡就不進行過多的介紹了。直接添加一個ProductsController。

添加一個包含IProductRepository執行個體的字段。

在控制器中調用new ProductRepository不是最好的設計,因為它關系到特定的實作的IProductRepository控制器。更好的方法,請參閱之後有關依賴注入的文章介紹。

  下面進行一一列舉每個HTTP方法。

第一個:為了得到所有的産品資訊清單,在控制器中添加的方法如下:

這個方法的名稱是以Get開頭,是以通過約定它映射為Get請求。此外,因為不包含參數,它映射到一個不包含在路徑中的id線段的URI。

第二個:通過産品ID擷取一個産品資訊,在控制器中添加的方法如下:

這個方法的名稱是以Get開頭,但是這個方法有一個名字為id的參數。這個參數被映射到URI路徑中的id一段。這個Asp.Net Web API架構自動把ID參數轉換為正确的int資料類型。

如果id無效,那麼就會抛出一個HttpReponseException的異常。此異常将由架構轉換成一個404錯誤。

第三個:按照類别查找産品資訊,在控制器中添加的方法如下:

如果請求的URI中包含查詢字元串,這個WebApi試圖在控制器方法的參數中來比對查詢字元串。是以,窗體中的“api/products?category=category”的URI将映射到此方法。

第四個:添加一個新的産品,在控制器中添加的方法如下:

請注意這個方法的兩個事情:

這個方法的名字以“Post”開頭,為了建立一個新的産品,這個用戶端将發送一個HTTP Post請求。

這個方法采用類型為Product的參數。在Web Api中複雜類型的參數是從請求消息體中反序列化得來的。是以,我們期望用戶端發送xml或者Json格式的一個産品對象的序列化表現形式。

此實作會工作,但它還很不完整。理想情況下,我們希望的 HTTP 響應,包括以下内容:

響應代碼:在預設情況下,這個Web API架構設定響應狀态碼為200(OK)。但是根據這個HTTP/1.1協定,當POST請求在建立一個資源時,這個服務端應該回複狀态201(Created)。

位置:當服務端建立一個資源時,它應該在響應的Location标頭中包含這個資源的URI。

 Asp.Net Web API使它容易操作HTTP響應消息。這是改善後的代碼:

請注意:此方法傳回類型現在是HttpResponseMessage。通過傳回HttpResponseMessage而不是産品,我們可以控制的 HTTP 響應消息,包括狀态代碼和位置标頭的詳細資訊。

 CreateResponse 方法将會建立 HttpResponseMessage,并自動将 Product 對象的序列化表示形式寫入到響應消息的正文中。

此示例不會驗證該<code>Product</code>。模型驗證有關的資訊,請參見Asp.Net Web API 模型驗證。(暫未實作)

 第四個:通過PUT更新産品,在控制器添加的代碼如下:

  方法名稱以Put開頭,這樣 Web API 就能夠将其與 PUT 請求相比對。這個方法有兩個參數,一個是産品ID和更新的産品。ID參數是從URI中獲得的,product參數是從請求正文反序列化得來的。預設情況下,ASP.NET Web API 架構從路由擷取簡單的參數類型,從請求正文擷取複雜的類型。

第五個:删除産品,在控制器添加的代碼如下:

如果删除請求成功,它可以傳回狀态 200 (OK) 與實體的描述該狀态 ;如果删除仍然挂起,則傳回狀态 202 (已接受);或狀态與沒有實體正文 204 (無内容)。在這種情況下, <code>DeleteProduct</code>方法具有<code>void</code>傳回類型,是以 ASP.NET Web API 自動轉換此狀态代碼 204 (無内容)。

總結

   在本次教程中,主要來探讨Wep API中的CRUD操作,針對前台的如何調用,這個在第一課中也有簡單的使用。