ASP.NET WebAPI在帖子体中的空值?

时间:2013-12-27 16:26:01

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

我今天刚刚开始学习WebAPI,我无法弄清楚为什么“帐户”总是为空。

请求

Content-Type: application/json; charset=utf-8
Request-Body: {"account":{"email":"awd","password":"awad","isNewsletterSubscribed":false}}

的WebAPI

 public class AccountsController : ApiController
    {
        public void Post([FromBody] string account)
            {
                    // account is null
            }
    }

在这种情况下,不应该包含json字符串吗?

1 个答案:

答案 0 :(得分:8)

  

在这种情况下,不应该包含json字符串吗?

这取决于您在发送请求时设置的特定Content-Type请求标头。例如,如果您使用默认的application/x-www-form-urlencoded,那么您的请求正文有效负载必须如下所示:

={"account":{"email":"awd","password":"awad","isNewsletterSubscribed":false}}

注意开头的=字符。这是我遇到过的最奇怪的事情之一。因为如果请求Web API不期望参数名称,只能绑定来自正文的一个参数,而只是绑定值。

这就是说,您的请求有效负载看起来更像是JSON。因此,设计视图模型并在发送请求时使用Content-Type: application/json会更有意义。将JSON对象绑定到字符串不常见。

所以:

public class UserViewModel
{
    public string Email { get; set; }
    public string Password { get; set; }
    public bool IsNewsletterSubscribed { get; set; }
}

public class AccountViewModel
{
    public UserViewModel Account { get; set; }
}

然后您的控制器操作将简单地将视图模型作为参数。在这种情况下,您不需要使用[FromBody]属性来装饰它,因为按照Web API中的惯例,默认模型绑定器将尝试从请求主体绑定复杂类型:

public class AccountsController : ApiController
{
    public HttpResponseMessage Post(AccountViewModel model)
    {
        // work with the model here and return some response
        return Request.CreateResponse(HttpStatusCode.OK);
    }
}

另请注意,由于HTTP是一个请求/响应协议,因此让Web API控制器操作返回响应消息更有意义,如我的示例所示,而不仅仅是使用某些void方法。这使代码更具可读性。您可以立即了解服务器将如何响应以及指定请求的状态代码。