c# - 针对错误请求的 .NET Core WepApi 模式
问题描述
我正在使用 .NET Core 5 Web API,我试图确定是否有比我当前处理 400 个错误请求的逻辑更好的模式。
它类似于这个问题 - Best practice to return errors in ASP.NET Web API
下面是我的代码
[HttpPost("register-customer")]
[Produces("application/json")]
[MapToApiVersion("1")]
public async Task<ActionResult<IRegistrationStatus>> RegisterCustomer([FromBody] Customer customer)
{
try
{
if (customer == null)
return StatusCode(400, "Request body is required");
if (string.IsNullOrEmpty(customer.FirstName))
return StatusCode(400, "First name is required");
if (string.IsNullOrEmpty(customer.LastName))
return StatusCode(400, "Last name is required");
if (string.IsNullOrEmpty(customer.EmailAddress))
return StatusCode(400, "Email address is required");
if (customer.Roles == null || customer.Roles.Count == 0)
return StatusCode(400, "At least one role is required");
//call service to register
return Ok(registrationStatus);
}
catch (Exception ex)
{
return StatusCode(500, ex.ToString());
}
}
所有代码都可以正常工作,但我想知道是否有更好的模式可以为我要检查的每个道具使用多个 if 语句。例如,我还有其他用于 RegisterEmployee 的 API,员工类是一个不同的模型,但它有一些相同的字段正在检查 400 - 即 FirstName,LastName - 我真的不想将模型更改为坐在后面说一个我想我可以做的人界面,然后员工和客户都会从它继承——如果我这样做了,这对我的 API 的消费者来说可能是一个重大变化
解决方案
您可以使用以下方法简化验证:
ApiController
控制器上的属性。它将强制执行自动 HTTP 400 响应。- 在模型 dto 类的成员上使用数据注释。强制
FirstName
不为空:
public class Customer
{
[Required]
public string FirstName { get; set; }
public string LastName { get; set; }
}
应用这两种技术,您可以省略if
检查。
推荐阅读
- javascript - 在 yajra laravel-datatables 上无法搜索布尔值 1 和 0
- function - Composer 在加载依赖项之前自动加载文件
- c# - Properties.Settings 在 VS 2013 CE 中不起作用
- python - 反转字符串 - 赋值前引用的局部变量
- python - 如何读取包含字符串的行,然后在没有该字符串的情况下提取该行
- jquery - 为什么带有 Jekyll 和 bootsratp 的 Modal Popup 只显示最后一个孩子的内容?
- aframe - 如何使用 aframe Daydream 触控板控件?
- linux - 使用 exiftool 将纬度-经度(来自文件)添加到 4000 张图像
- url - AWS Cloudfront Link 不通过网络提供服务
- python - 使用我的 python 函数获取完整数据时出错?