gpt4 book ai didi

asp.net - Web API 中的 [FromRoute] 和 [FromBody] 有什么区别?

转载 作者:行者123 更新时间:2023-12-01 19:34:12 24 4
gpt4 key购买 nike

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

Specifies that a parameter or property should be bound using the request body.

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

FromRouteAttribute

Summary: Specifies that a parameter or property should be bound using route-data from the current request.

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

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

因此,这将尝试根据具有相同名称的路由参数绑定(bind)facilityId

Complete route definition: /api/Settings/GetTotalBandwidth/{facilityId}
Complete received url: /api/Settings/GetTotalBandwidth/100
<小时/>

编辑

根据您的上一个问题,以下是相应的代码,假设您希望将 163 绑定(bind)到facilityId,将 10 绑定(bind)到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

关于asp.net - Web API 中的 [FromRoute] 和 [FromBody] 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37276932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com