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

时间:2018-12-24 10:06:04

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

我正在创建一个API,它将接受参数(类型为double)并返回结果。 例如     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,我想在输入无效的情况下返回一条消息。

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

1 个答案:

答案 0 :(得分: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,以显示验证模型时发生的错误列表。如果您不想包含此内容,可以在调用ModelState时省略BadRequest参数。


或者,您可以简单地使用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中详细介绍的那样,您甚至可以根据需要自定义返回的自动响应。