默认行为是:
如果参数是 primitive 类型(int、bool、double、...),Web API 会尝试获取HTTP 请求的 URI 中的值。
对于复杂类型(您自己的对象,例如:Person),Web API 会尝试从 HTTP 请求的正文。
所以,如果你有:
...那么您不必添加任何属性([FromBody] 和 [FromUri] 都不需要)。
但是,如果你在 body 中有一个原始类型,那么你必须添加@987654328 @ 在您的 WebAPI 控制器方法中的原始类型参数前面。 (因为默认情况下,WebAPI 会在 HTTP 请求的 URI 中寻找原始类型。)
或者,如果您的 URI 中有 复杂类型,则必须添加 [FromUri] . (因为默认情况下,WebAPI 会在 HTTP 请求的正文中查找复杂类型。)
原始类型:
public class UsersController : ApiController
{
// api/users
public HttpResponseMessage Post([FromBody]int id)
{
}
// api/users/id
public HttpResponseMessage Post(int id)
{
}
}
复杂类型:
public class UsersController : ApiController
{
// api/users
public HttpResponseMessage Post(User user)
{
}
// api/users/user
public HttpResponseMessage Post([FromUri]User user)
{
}
}
只要您在 HTTP 请求中仅发送一个参数,此方法就有效。 发送多个时,您需要创建一个自定义模型,其中包含您的所有参数,如下所示:
public class MyModel
{
public string MyProperty { get; set; }
public string MyProperty2 { get; set; }
}
[Route("search")]
[HttpPost]
public async Task<dynamic> Search([FromBody] MyModel model)
{
// model.MyProperty;
// model.MyProperty2;
}
来自 Microsoft 的 parameter binding in ASP.NET Web API 文档:
当参数有 [FromBody] 时,Web API 使用 Content-Type 标头
选择格式化程序。在此示例中,内容类型为
"application/json" 并且请求正文是原始 JSON 字符串(不是
JSON 对象)。 最多允许读取一个参数
邮件正文。
这应该可行:
public HttpResponseMessage Post([FromBody] string name) { ... }
这不起作用:
// Caution: This won't work!
public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... }
此规则的原因是请求正文可能存储在
只能读取一次的非缓冲流。