[.NET Core] Web API 的 Action Response 類型

在 .NET Core Web API 中有以下 3 種方法可以回傳數據,以下簡單說明一下,並展示一下在 Swagger 中顯示的差別。

  1. 指定類型
  2. IActionResult
  3. ActionResult<T>

 

 

指定類型

顧名思義就是直接指定回傳型別為原始數據 (string、int、自定義類別)

[HttpPost]
public ValuesModel GetValueInfo1(ValuesModel model)
{
    return model;
}

因為他是明確的指定型別,所以在 Swagger Responses 區可以正常的顯示 example ↓

 

 

IActionResult

指定返回型別為 IActionResult 介面的話,他可以使用各種包含 Http Status 的 ObjectResult method (NotFound / Ok / BadRequest 等)

[HttpPost]
public IActionResult GetValueInfo2(ValuesModel model)
{
    return Ok(model);
}

而且可以不只回傳一種型別

[HttpPost]
public IActionResult GetValueInfo2(ValuesModel model)
{
    if (model.MyId == 0)
    {
        return BadRequest("id is not null."); //return string
    }
    else
    {
        return Ok(model); //return data model
    }
}

不過因為他沒有明確的指定型別,所以 Swagger 無法取得他應該顯示怎樣格式的 Response example

 

如果要在 Swagger 顯示 IActionResult 型別的 Response example,就必須使用[ProducesResponseType]明確指定

[HttpPost]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(ValuesModel))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public IActionResult GetValueInfo2(ValuesModel model)
{
    if (model.MyId == 0)
    {
        return BadRequest("id is not null.");
    }
    else
    {
        return Ok(model);
    }
}

 

 

ActionResult<T>

在 .NET Core 2.1 之後出了一個新的泛型 ActionResult,他與 IActionResult 一樣可以使用各種包含 Http Status 的 ObjectResult method,也能回傳多種型別,但是他還多了以下幾個優點:

  1. 可以省略[ProducesResponseType(200)]
  2. 支援自動將 T 轉換為 ObjectResult,代表return Ok(model);可以省略成寫return model;
     
[HttpPost]
public ActionResult<ValuesModel> GetValueInfo3(ValuesModel model)
{
    if (model.MyId == 0)
    {
        return BadRequest("id is not null.");
    }
    else
    {
        return model;
    }
}

他的 Response example 會取 T 來顯示,轉換成[ProducesResponseType(200)],但如果你有多個回傳型別,其他型別就還是要自己指定就是了