首页 > 解决方案 > 针对错误请求的 .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 的消费者来说可能是一个重大变化

标签: c#.netasp.net-coreasp.net-core-webapi

解决方案


您可以使用以下方法简化验证:

  • ApiController控制器上的属性。它将强制执行自动 HTTP 400 响应
  • 在模型 dto 类的成员上使用数据注释。强制FirstName不为空:
    public class Customer
    {
        [Required]
        public string FirstName { get; set; }

        public string LastName { get; set; }
    }

应用这两种技术,您可以省略if检查。


推荐阅读