【问题标题】:ASP.NET Web API body value restrictionASP.NET Web API 正文值限制
【发布时间】:2013-08-09 01:55:15
【问题描述】:

我正在研究 ASP.NET Web API,但在关于来自请求正文的复杂类型的解释中,作者让我感到困惑:

PROFESSIONAL ASP.NET MVC 4:第 11 章 - ASP.NET Web API

"[..] 复杂类型(所有其他)都取自主体。有 还有一个额外的限制:只能来自一个值 身体,并且该值必须代表身体的整体。 [...]”

布拉德·威尔逊

他的这个“单一价值可以来自身体”是什么意思? API 格式化程序只能从正文中解析一个对象类型?你能举例说明吗?

【问题讨论】:

  • 可能作者的意思是身体必须与预期的控制器输入完全对应。只是必要的数据,仅此而已。

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


【解决方案1】:

body 中只能有一个值

假设您有这样的请求正文。

{"Id":12345, "FirstName":"John", "LastName":"West"}

您希望将此 JSON 绑定到此类类型的参数。

public class Employee
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

动作方法可以像void Post(Employee emp)。不可能是这样的——void Post(Employee john, Employee duplicateJohn)。正文中只能有一个值。

并且该值必须代表整个正文

假设你有这样的相同请求体。

{"Id":12345, "FirstName":"John", "LastName":"West"}

你有两个这样的 DTO。

public class Identifier
{
    public int Id { get; set; }
}

public class Name
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

您不能拥有像void Post(Identifier id, Name name) 这样的操作方法并期望主体部分绑定到两个参数。整个正文必须仅绑定到 一个 值。所以,有一个像

public class Employee
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

并且只允许将整个请求正文绑定到一个值,例如void Post(Employee emp)

【讨论】:

  • 谢谢!我在推特上对布拉德说,他说你摇滚!现在清楚多了!
【解决方案2】:

这基本上意味着您不能拥有描述多个复杂类型的多部分正文。假设你有一个 User 类型,整个正文必须描述 User 类型,而不是 User + ShoppingChart 类型。

User 类型的有效正文:

{
   "id" : "1",
   "username" : "someuser"
}

User 类型的正文无效:

{
   "user" : {
      "id" : "1",
      "username" : "someuser"
   },

   "shoppingCart" : {
      "cartId" : "1",
      "items" : "5"
   }
}

当然,您可以创建一个新的复杂类型,如 UserAndShoppingCart(它使用用户和购物车类作为属性),现在无效的正文将是有效的并且可以反序列化这个新类型。

【讨论】:

  • 我在推特上告诉布拉德,他说你摇滚!我得到了另一个,只是因为他在 awsear 中投入了更多的精力!无论如何,谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
  • 2016-07-19
  • 1970-01-01
相关资源
最近更新 更多