我正在按照MVC模式在.Net core 2.2上开发rest api。
我有一个具有类似post方法的控制器...
// POST: api/Todo
[HttpPost]
public async Task<ActionResult<TodoItem>> PostTodoItem(string param, [FromBody] TodoItem item)
{
// some work...
return CreatedAtAction(nameof(GetTodoItem), new { id = item.Id }, item);
}
它工作正常。
客户要求在同一路径上具有一个api,但是Json主体可以具有2种不同的结构,并在不同的模式上承载相同的数据。
我考虑使用
PostTodoItem(string param, [FromBody] Object item)
{
// TryCast item to one of the possible POCO classes then work with the correct one.
}
您知道更好的方法吗,也许有一些高级的路由和过滤选项?
答案 0 :(得分:1)
这是不可能的,也不是可取的。 REST的核心租户几乎是唯一代表特定资源的URI。如果您有一个类似POST /todo
的URI,则帖子正文应为“待办事项”,并应基于此内容创建一个新的“待办事项”。在这里,这是一个TodoItem
,所以所有都应该发布。
除了REST,这根本行不通。当您的动作被激活时,模型绑定器尝试将帖子主体绑定到该动作接受的参数。基本上,它只是将参数的类型变成新闻,然后尝试从post正文中查找某些内容以绑定到该类型的各种属性。这是对正在发生的事情的有意简化说明。重要的是,参数的类型指示了柱体的绑定方式。如果您绑定到object
(没有成员)或什至是基本类型,则将被绑定的帖子正文中仅有的成员是该类型上存在的那些成员,而不是其派生类型。任何无法绑定的东西都会被丢弃。
总之,对于每种类型的事物,您都需要一条独特的路线。在后台,您可以通过将通用功能分解为私有方法,采用继承等方式来共享或重用代码,但是您需要采取不同的操作和方法来处理每种情况。