在 .NET Core Web API 中有以下 3 種方法可以回傳數據,以下簡單說明一下,並展示一下在 Swagger 中顯示的差別。
指定類型
顧名思義就是直接指定回傳型別為原始數據 (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,也能回傳多種型別,但是他還多了以下幾個優點:
- 可以省略
[ProducesResponseType(200)]
- 支援自動將 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)]
,但如果你有多個回傳型別,其他型別就還是要自己指定就是了