Web API 標準答案
WebAPI, Swagger
引言
關鍵資訊
錯誤處理
參考文件
關鍵原碼紀錄
模式一:透過 ActionResult<T> 泛型
模式二:直接用物件
模式三:透過 IActionResult 介面
沒圖沒真象
Last updated
WebAPI, Swagger
Last updated
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.Annotations;
//※ 用 Swashbuckle 或 NSwag 的碼都一樣。
namespace YourProject.Controllers;
[ApiController]
[Route("api/[controller]/[action]")]
public class FooController : ControllerBase
{
readonly ILogger<FooController> _logger;
public FooController(ILogger<FooController> logger)
{
_logger = logger;
}
[HttpPost]
public ActionResult<EchoResult> Echo(EchoArgs args)
{
try
{
// 模擬執行失敗
if (args.LetMeFail)
{
_logger.LogError("這是邏輯錯誤。");
return BadRequest("這是邏輯錯誤。");
}
// 模擬出現預期之外的例外
if (DateTime.Now.Second % 3 == 0)
{
throw new ApplicationException("這是例外訊息!");
}
// success
_logger.LogInformation("這是成功訊息。");
return Ok(new EchoResult
{
Echo = $"{args.Knock}@{DateTime.Now:HH:mm:ss}",
});
}
catch (Exception ex)
{
_logger.LogError(ex, "執行XXX出現例外!" + ex.Message);
return BadRequest("執行XXX出現例外!" + ex.Message);
// throw new BadHttpRequestException("執行XXX出現例外!" + ex.Message, ex); // 送回完整的例外訊息。
}
}
}using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.Annotations;
//※ 用 Swashbuckle 或 NSwag 的碼都一樣。
namespace YourProject.Controllers;
[ApiController]
[Route("api/[controller]/[action]")]
public class FooController : ControllerBase
{
readonly ILogger<FooController> _logger;
public FooController(ILogger<FooController> logger)
{
_logger = logger;
}
[HttpPost]
public EchoResult Echo2(EchoArgs args)
{
try
{
// 模擬執行失敗
if (args.LetMeFail)
{
_logger.LogError("這是邏輯錯誤。");
throw new ApplicationException("這是邏輯錯誤。");
// ※這個模式下就算是邏輯錯誤也只能以例外處理!
}
// 模擬出現預期之外的例外
if (DateTime.Now.Second % 3 == 0)
{
throw new ApplicationException("這是例外訊息!");
}
// success
_logger.LogInformation("這是成功訊息。");
return new EchoResult
{
Echo = $"{args.Knock}@{DateTime.Now:HH:mm:ss}",
};
}
catch (Exception ex)
{
_logger.LogError(ex, "執行XXX出現例外!" + ex.Message);
throw new BadHttpRequestException("執行XXX出現例外!" + ex.Message, ex); // 送回完整的例外訊息。
}
}
}using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.Annotations;
//※ 用 Swashbuckle 或 NSwag 的碼都一樣。
namespace YourProject.Controllers;
[ApiController]
[Route("api/[controller]/[action]")]
public class FooController : ControllerBase
{
readonly ILogger<FooController> _logger;
public FooController(ILogger<FooController> logger)
{
_logger = logger;
}
[HttpPost]
[SwaggerResponse(200, Type = typeof(EchoResult))]
[SwaggerResponse(400, Type = typeof(string))]
public IActionResult Echo3([FromBody] EchoArgs args)
{
try
{
// 模擬執行失敗
if (args.LetMeFail)
{
_logger.LogError("這是邏輯錯誤。");
return BadRequest("這是邏輯錯誤。");
}
// 模擬出現預期之外的例外
if (DateTime.Now.Second % 3 == 0)
{
throw new ApplicationException("這是例外訊息!");
}
// success
_logger.LogInformation("這是成功訊息。");
return Ok(new EchoResult
{
Echo = $"{args.Knock}@{DateTime.Now:HH:mm:ss}",
});
}
catch (Exception ex)
{
_logger.LogError(ex, "執行XXX出現例外!" + ex.Message);
return BadRequest("執行XXX出現例外!" + ex.Message);
// throw new BadHttpRequestException("執行XXX出現例外!" + ex.Message, ex); // 送回完整的例外訊息。
}
}
}