假设我有一个名为Employee的基本实体类型和一个名为Manager的派生实体类型。并且可以通过/Employees
URL访问所有员工的集合。将Manager实例发布到Employees实体集的正确方法是什么?
OData v4 protocol spec说“要在集合中创建实体,客户端会向该集合的URL发送POST请求。”但是规范没有说明在存在派生类型的情况下指定POSTed实体的类型。
URI spec表示派生类型应使用目标网址上的强制转换段进行处理。例如,
POST /Employees/NS.Manager
{ "Name": "Bill Lumbergh" ... }
同时,JSON Format spec建议使用odata.type
注释,如下所示:
POST /Employees
{ "@odata.type": "#NS.Manager", "Name": "Bill Lumbergh" ... }
哪个是正确的?或两者都是?
请记住,我询问的是OData规范,而不是特定的OData库/框架(例如ASP.NET)。
答案 0 :(得分:3)
好问题!
从OData协议的角度来看,如果要在从目标类型派生的JSON请求中指定实例,则应包含@ odata.type注释。您不需要在POST上指定强制转换段(尽管某些实现可能支持,有些可能不支持)。
所以我希望你的第二个例子是最具互操作性的。
谢谢,
迈克皮佐 联合编辑,OASIS OData规范答案 1 :(得分:1)
对于#1,
POST /Employees/NS.Manager
{ "Name": "Bill Lumbergh" ... }
您将获得Manager
个实例。因此,您可以直接访问定义到Manager
的属性。
对于#2,
POST /Employees
{ "@odata.type": "#NS.Manager", "Name": "Bill Lumbergh" ... }
您将获得Employee
个实例。因此,您应该将实例强制转换为Manager
,然后访问Manager
属性。
对于#1,它将在EmployeesController
public IHttpActionResult PostFromManager(Manager manager)
{ ... }
而对于#2,它将在EmployeesController
public IHttpActionResult Post(Employee employee)
{ ... }