Несколько полезных нагрузок в ядре MVC остальные API - PullRequest
0 голосов
/ 11 февраля 2019

Я разрабатываю API для отдыха на .Net core 2.2 по схеме MVC.

У меня есть контроллер с методом 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. 
} 

Знаете ли вы лучший способ, может быть, с некоторыми дополнительными опциями маршрутизации и фильтрации?

1 Ответ

0 голосов
/ 11 февраля 2019

Это не возможно и не желательно.В основном ядром REST является URI, который уникальным образом представляет конкретный ресурс.Если у вас есть URI, такой как POST /todo, то тело сообщения должно быть «todo», и оно должно создавать новое «todo» на основе этого.Здесь это TodoItem, то есть все , которые должны быть когда-либо опубликованы.

REST в стороне, это просто не будет работать.Когда ваше действие активировано, связыватель модели пытается связать тело сообщения с параметрами, которые принимает действие.По сути, он просто сообщает о том, какой бы тип параметра не был, а затем пытается найти что-то из тела сообщения, чтобы связать его с различными свойствами этого типа.Это намеренно упрощенное описание того, что происходит;важная часть заключается в том, что тип параметра сообщает, как связано тело сообщения.Если вы привязываетесь к object (у которого нет членов) или даже к базовому типу, то единственными элементами тела сообщения, которые будут связаны, являются те, которые присутствуют в этом типе, а не производные типы.Все, что не может быть связано, отбрасывается.

Длинным и коротким, вам нужен уникальный маршрут для каждого типа вещей, с которыми вы работаете.Изнутри вы можете делиться или иным образом повторно использовать код, выделяя общие функции в частные методы, используя наследование и т. Д., Но вам необходимо отдельное действие и маршрут для обработки каждого случая.

...