ASP.NET Core WebAPI控制器返回類型的最佳選項

前言

從.NET Core 2.1版開始,到目前爲止,控制器操做能夠返回三種類型的WebApi響應。這三種類型都有本身的優勢和缺點,但都缺少知足REST和高可測性的選項。 單元測試

ASP.NET Core中可用的響應類型包括最近發佈的2.2版本測試

  • 具體類型的結果
  • IActionResult 
  • 的ActionResult <T>

最後一個reult選項  ActionResult <T>是在.NET Core 2.1中引入的。我將使用一個簡單的例子來比較使用這三個控制器動做響應類型選項的優缺點。spa

文章內容

返回HTTP狀態

這是您在WebAPI應用程序開發過程當中必需要具有的。雖然能夠遵循REST,可是任何程序功能都是由業務需求驅動的。若是因爲控制器操做而返回特定類型,您可能偶爾發現的一件事確定會返回自定義HTTP狀態代碼。3d

讓咱們看看具備特定類型返回的簡單操做,並讓它們注意比較。code

具體類型

[HttpGet("{id}")] public IEnumerable<string> GetById(int id) { if (id>0) { return new List<string>() { "Value1","Value2","Value3" }; } return null; }

咱們有了上面的簡單單嗎,若是ID參數大於0,並返回字符串列表,反則返回null。轉換成HTTP,對於任何返回的數據,咱們將有 200 OK 狀態嗎響應,如下是我使用PostMan的測試結果圖,請參考。blog

 

 

 若是沒有數據,咱們將會有一個204 No Content 響應。 對於大多數客戶來講,這是很是滿意的,可是假設咱們須要返回另外一個狀態代碼,例如,小於0的任何值,咱們直接但願告訴客戶發送的數據無效,理想狀況下,咱們將會返回404 BadRequest狀態代碼。開發

如今這是特定類型選項問題,因爲咱們的方法,咱們不能當即返回400 BadRequest狀態代碼,若是咱們決定拋出一個異常會致使500 ServerError的響應,這是錯誤的,由於無效數據基本上是客戶端錯誤而且屬於4xx響應代碼列表。字符串

執行此操做的方法是顯示設定響應狀態碼並返回空值,這樣就能夠保留未同步的兩個操做間隙,由於你必需要處理狀態並返回數據。同步

[HttpGet("{id}")] public IEnumerable<string> GetById(int id) { if (id > 0) { return new List<string>() { "Value1","Value2","Value3" }; } else if (id < 0) Response.StatusCode = 400; return null; }

處理HTTP POST和HTTP PATCH / PUT請求時遇到的問題更多,而不是200 OK,除了以前的400 BadRequest以外,您可能還必須使用201 Created of 202 Accepted HTTP狀態代碼進行響應,這將是模型驗證的狀況。使用不一樣的狀態代碼並非那麼直接,而且您有多條線負責正確的響應,這與其餘兩種返回類型不一樣。string

IActionResult

讓咱們看看咱們如何經過使用IActionResult做爲控制器動做的返回類型來解決這個問題

[HttpGet("{id}")] public IActionResult GetById(int id) { if (id > 0) { return Ok(new List<String>() { "Value1", "Value2", "Value3", }); } else if (id < 0) { return BadRequest(); } return NoContent(); }

如今咱們能夠自由使用咱們認爲適合的狀態代碼,以告知客戶咱們或咱們沒有任何限制地處理他的請求。使用IAction結果顯然比返回特定類型實例更先進,讓.NET決定什麼是狀態代碼。

ActionResult<T>

關於狀態代碼,IActionResult和ActionResult <T>返回類型一樣適用在從方法返回結果時直接設置狀態代碼方面會產生很大差別

可是,還有其餘方面,ActionResult <T>比IActionResult更高級,更適合從控制器操做方法返回響應。

[HttpGet("{id}")] public ActionResult<IEnumerable<string>> GetById(int id) { if (id > 0) { return Ok(new List<String>() { "Value1", "Value2", "Value3", }); } else if (id < 0) { return BadRequest(); } return NoContent(); }

您已經瞭解了ASP.NET MVC Core WebAPI項目中控制器操做的不一樣響應類型的一些優缺點。很明顯IActionResult和ActionResult <T>是比返回特定類型更好的選擇,雖然您可能會發如今控制器操做中返回特定類型更爲溫馨,但您可能會使單元測試沒法正確覆蓋您的代碼,所以未來可能會打開潛在的危險。

總結

具體類型

若是在執行動做期間沒有已知的防範條件,則返回特定類型就足夠了。上述操做不接受任何參數,所以不須要參數約束驗證。

IActionResult類型

 當一個動做中有多個ActionResult返回類型時,IActionResult返回類型是合適的。這些類型表明各類HTTP狀態代碼。屬於此類別的一些常見返回類型是BadRequestResult(400),NotFoundResult(404)和OkObjectResult(200)。

ActionResult <T>類型

 大多數操做都有特定的返回類型。在操做執行期間可能發生意外狀況,在這種狀況下不返回特定類型。例如,操做的輸入參數可能沒法經過模型驗證。在這種狀況下,一般返回適當的ActionResult類型而不是特定類型。

相關文章
相關標籤/搜索