我正在研究 ASP.NET Web API,但是在关于来自请求正文的复杂类型的解释中,作者让我感到困惑:
专业的 ASP.NET MVC 4:第 11 章 - ASP.NET Web API
“[..] 复杂类型(其他所有内容)都取自主体。还有一个额外的限制:只有一个值可以来自主体,并且该值必须代表整个主体。[... ]"
布拉德·威尔逊
他说的“单一价值可以来自身体”是什么意思?API 格式化程序只能从正文中解析一种类型的对象?你能举例说明这一点吗?
我正在研究 ASP.NET Web API,但是在关于来自请求正文的复杂类型的解释中,作者让我感到困惑:
专业的 ASP.NET MVC 4:第 11 章 - ASP.NET Web API
“[..] 复杂类型(其他所有内容)都取自主体。还有一个额外的限制:只有一个值可以来自主体,并且该值必须代表整个主体。[... ]"
布拉德·威尔逊
他说的“单一价值可以来自身体”是什么意思?API 格式化程序只能从正文中解析一种类型的对象?你能举例说明这一点吗?
正文中只能有一个值
假设您有这样的请求正文。
{"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)
并且只允许将请求正文整体绑定到一个值,例如。
这基本上意味着您不能拥有描述多个复杂类型的多部分正文。假设你有一个User
类型,整个主体必须描述该User
类型而不是User
+ShoppingChart
类型。
类型的有效主体User
:
{
"id" : "1",
"username" : "someuser"
}
类型无效的主体User
:
{
"user" : {
"id" : "1",
"username" : "someuser"
},
"shoppingCart" : {
"cartId" : "1",
"items" : "5"
}
}
当然,您可以创建一个新的复杂类型,例如UserAndShoppingCart
(它使用用户和购物车类作为属性),现在无效的主体将是有效的,并且对于这种新类型是可反序列化的。