Web API中的[FromRoute][FromBody]有什么区别?

[Route("api/Settings")]
public class BandwidthController : Controller
{
    // GET: api/Settings
    [HttpGet]
    public IEnumerable<Setting> GetSettings()
    {
        return _settingRespository.GetAllSettings();
    }

    // GET: api/Settings/1
    [HttpGet("{facilityId}", Name = "GetTotalBandwidth")]
    public IActionResult GetTotalBandwidth([FromRoute] int facilityId)
    {
        if (!ModelState.IsValid)
        {
            return HttpBadRequest(ModelState);
        }
    }
}

也适用于PUT:
// PUT: api/Setting/163/10
[HttpPut]
public void UpdateBandwidthChangeHangup([FromRoute] int facilityId, int bandwidthChange)
{
    _settingRespository.UpdateBandwidthHangup(facilityId, bandwidthChange);
}

我可以使用[FromBody]吗?

最佳答案


当您使用FromBody属性时,您将指定数据来自请求正文,而不是来自请求URL / URI。您不能将此属性与HttpGet请求一起使用,而只能与PUT,POST和Delete请求一起使用。另外,在Web API中,每个操作方法只能使用一个FromBody属性标签(如果mvc核心中的此方法已更改,我将找不到任何支持该属性的标签)。

本质上,它FromRoute将查看您的路由参数,并基于此参数提取/绑定(bind)数据。由于路由是从外部调用的,因此通常基于URL。在Web api的早期版本中,这可与FromUri相提并论。

[HttpGet("{facilityId}", Name = "GetTotalBandwidth")]
public IActionResult GetTotalBandwidth([FromRoute] int facilityId)
因此,这将尝试基于具有相同名称的route参数绑定(bind)facilityId
Complete route definition: /api/Settings/GetTotalBandwidth/{facilityId}
Complete received url: /api/Settings/GetTotalBandwidth/100

编辑
根据您的最后一个问题,以下是相应的代码,假设您希望将163绑定(bind)到facilityId,将10绑定(bind)到bandageChange参数。
// PUT: api/Setting/163/10

[HttpPut("{facilityId}/{bandwidthChange}")] // constructor takes a template as parameter
public void UpdateBandwidthChangeHangup([FromRoute] int facilityId, [FromRoute] int bandwidthChange) // use multiple FromRoute attributes, one for each parameter you are expecting to be bound from the routing data
{
    _settingRespository.UpdateBandwidthHangup(facilityId, bandwidthChange);
}
如果其中一个参数包含复杂的对象,并且希望将其作为Http Request的主体发送,则可以对该参数使用FromBody而不是FromRoute。这是取自Building Your First Web API with ASP.NET Core MVC的示例
[HttpPut("{id}")]
public IActionResult Update([FromRoute] string id, [FromBody] TodoItem item);
MVC Core中还有其他选项,例如FromHeaderFromFormFromQuery

08-25 15:07