Web Api中[FromRoute]和[FromBody]有什么区别?

时间:2016-05-17 12:59:22

标签: asp.net asp.net-web-api

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吗?

1 个答案:

答案 0 :(得分:17)

  

FromBody

     

指定应使用请求正文绑定参数或属性。

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

  

FromRouteAttribute

     

摘要:指定应使用当前请求中的路由数据绑定参数或属性。

基本上,FromRoute将查看您的路由参数,并根据该参数提取/绑定数据。由于路由在外部调用时通常基于URL。在以前版本的web api中,这与FromUri相当。

[HttpGet("{facilityId}", Name = "GetTotalBandwidth")]
public IActionResult GetTotalBandwidth([FromRoute] int facilityId)

因此,这将尝试基于具有相同名称的route参数绑定facilityId

Complete route definition: /api/Settings/GetTotalBandwidth/{facilityId}
Complete received url: /api/Settings/GetTotalBandwidth/100

修改

根据您的上一个问题,这里是相应的代码,假设您希望将163绑定到facilityId,将10绑定到bandwidthChange参数。

// 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请求的正文发送,那么您可以在该参数上使用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中还有其他选项,例如FromHeaderFromForm以及FromQuery

相关问题