return 从 Web Api 计算结果的正确方法

Proper way to return calculation result from Web Api

我正在创建一个 API 它将采用参数(类型为双精度)和 return 结果。 前任。 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;           
        }
    }
}

使用上面的代码,我可以接收参数,验证它们并return一个数字结果。

不过似乎有些不对劲。我不想在无效模型状态下 return 0,我想在输入无效时 return 一条消息。

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

这是 HTTP 状态代码的用途。在您的成功案例中,200 被 returned 表示请求成功。对于无效的ModelState,常见的是return400(表示请求错误)。

要在 ASP.NET 核心中实现这一点,您可以利用 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 class,这将导致任何导致 ModelState 到 [=40] 无效的请求=]自动 return一个400带有JSON序列化错误。这是该方法的一个示例:

[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 属性的存在已经检查过了。如果需要,您甚至可以自定义获得 returned 的自动回复,正如我在另一个答案 .

中详述的那样