【问题标题】:Proper way to return calculation result from Web Api从 Web Api 返回计算结果的正确方法
【发布时间】:2018-12-24 10:06:04
【问题描述】:

我正在创建一个 API,它将接受参数(双精度类型)并返回结果。 前任。 http://localhost:54897/api/Power/Nominal/6/-2

在浏览器中,我会看到: 4.0

这是我目前的代码:

型号

public class PowerModel
{
    [Required]
    [Range(0,50)]
    public  double PowerFront { get; set; }

    [Required]
    [Range(-50,-1)]
    public  double PowerBack { get; set; }

    [Required]
    public  double Result { get; set; }
}

控制器

[Produces("application/json")]
[Route("api/Power")]
public class PowerController : Controller
{
    [HttpGet("Nominal/{powerFront}/{powerBack}")]
    public double NominalPower(PowerModel powerModel)
    {
        if (ModelState.IsValid)
        {   
            powerModel.Result = Power.NominalPower(powerModel.PowerFront, powerModel.PowerBack);
            return powerModel.Result;
        }
        else
        {
            return 0;           
        }
    }
}

通过上面的代码,我可以接受参数,验证它们并返回一个数字结果。

但似乎有些不对劲。我不想在模型状态无效时返回 0,我想在输入无效时返回消息。

接收参数(最好命名)、使用属性验证这些参数、执行计算、在成功输入时返回值或在输入错误时显示错误消息的最佳方法是什么?

【问题讨论】:

    标签: c# asp.net-core asp.net-core-webapi asp.net-core-2.2


    【解决方案1】:

    这是 HTTP 状态码的用途。在您成功的情况下,返回200 表示请求成功。对于无效的ModelState,通常会返回400(这表示发出了错误的请求)。

    要在 ASP.NET Core 中实现这一点,您可以利用 ActionResult<T>。这是一个完整的例子,说明这将如何影响NominalPower

    [HttpGet("Nominal/{powerFront}/{powerBack}")]
    public ActionResult<double> NominalPower(PowerModel powerModel)
    {
        if (!ModelState.IsValid)
            return BadRequest(ModelState);
    
        powerModel.Result = Power.NominalPower(powerModel.PowerFront, powerModel.PowerBack);
        return powerModel.Result;
    }
    

    在上面的示例中,我们将ModelState 传递给BadRequest 方法,该方法将被序列化为JSON 以显示验证模型时发生的错误列表。如果你不想包含这个,你可以在调用 BadRequest 时省略 ModelState 参数。


    或者,您可以简单地使用ApiController 属性装饰您的PowerController 类,这将导致任何导致无效ModelState 的请求自动返回带有JSON 的400 - 序列化错误。这是该方法的一个示例:

    [Produces("application/json")]
    [Route("api/Power")]
    [ApiController]
    public class PowerController : Controller
    {
        [HttpGet("Nominal/{powerFront}/{powerBack}")]
        public double NominalPower(PowerModel powerModel)
        {
            powerModel.Result = Power.NominalPower(powerModel.PowerFront, powerModel.PowerBack);
            return powerModel.Result;
        }
    }
    

    在这个版本中,不需要检查ModelState,因为ApiController 属性的存在已经检查过了。如果需要,您甚至可以自定义返回的自动响应,正如我在另一个答案here 中详述的那样。

    【讨论】:

      猜你喜欢
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      相关资源
      最近更新 更多