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 的自动回复,正如我在另一个答案 .
中详述的那样
我正在创建一个 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 的自动回复,正如我在另一个答案