对于带有 [ApiController]
特性的控制器,如果缺少 [FromBody]
标签,API调用是否会直接将请求体解析到对象上?
-- 如果控制器上有 [ApiController]
特性,答案是“是”。
能否正确从查询参数中解析ID,并从请求体中解析Object?
-- 是的,但请注意,带有 [ApiController]
特性的控制器不会默认将简单类型从请求体中绑定。
在这种形式下,如果没有 [FromBody]
修饰符则无法正常工作,但添加后就能正常工作。
-- 对于不带 [ApiController]
特性的控制器,你需要手动添加 [FromBody]
特性,否则默认情况下它会从请求表单读取值。
您可以查阅官方文档的这一部分:https://learn.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-8.0#binding-source-parameter-inference
引用官方文档内容:
[ApiController]
特性为动作参数提供了默认数据源的推断规则。这些规则可以避免您手动为动作参数应用绑定源属性。绑定源推断规则遵循以下行为:
- 注册在依赖注入容器中的复杂类型参数会被推断为
[FromServices]
。
- 未注册在依赖注入容器中的复杂类型参数会被推断为
[FromBody]
。例外情况是具有特殊含义的复杂内建类型(如 IFormCollection
和 CancellationToken
),绑定源推断代码会忽略这些特殊类型。
- 类型为
IFormFile
或 IFormFileCollection
的动作参数会被推断为 [FromForm]
。但对于任何简单类型或用户自定义类型,则不会推断为 [FromForm]
。
- 名称与路由模板中参数相匹配的任何动作参数会被推断为
[FromRoute]
。如果有多个路由匹配一个动作参数,则所有路由值都将视为 [FromRoute]
。
- 其他任何动作参数会被推断为
[FromQuery]
。