У меня есть объекты виджетов, которые принадлежат объектам компании. Между компаниями и виджетами существует отношение один ко многим.
Вот мой первый проход по методу Put:
[Route("MyApi/Companies/{companyId}/WidgetAdministration/[controller]")]
[HttpPut("{widgetId}")]
public async Task<ActionResult> UpdateWidget([FromRoute]int companyId, [FromRoute]int widgetId, WidgetDTO widgetDto)
{
widgetDto.CompanyId = companyId;
widgetDto.WidgetId = widgetId;
Widget widget = await _myContext.Widgets
.FirstOrDefaultAsync(e => e.CompanyId == companyId && e.WidgetId == widgetId);
if (widget == null)
{
return NotFound();
}
else
{
_mapper.Map(widgetDto, widget);
await _myContext.SaveChangesAsync();
return Ok();
}
}
В сущности, есть две вещи, которые могут go ошибаться.
ПЕРВЫЙ - Виджет не принадлежит Компании.
Если это произойдет, я считаю, что мне нужно вернуть 404 / NotFound. Из предыдущего вопроса, который я задал, я был убежден, что если я хочу получить «Компанию 1», «Виджет 55», но «Виджет 55» не принадлежит «Компании 1», то 404 / NotFound является правильным ответом. 404 относится не к Widget / 55, а ко всему URI ресурса: Company / 1 / Widget / 55. Я предполагаю, что тот же лог c будет применяться как в PUT, так и в GET.
ВТОРОЕ - Компания не существует
Эта задача немного сложнее. Это может быть:
404 / NotFound - после логики c в сценарии ошибки FIRST.
400 / BadRequest - потому что пользователь сделал то, что не должен был делать, пытаясь обновить виджет, не принадлежащий этой компании. (плюс, я видел это в видео PluralSite)
Есть мысли?
Кроме того, если в качестве идентификатора параметра не совпадают идентификаторы в DTO, мы определили, что мы просто переопределит значения в DTO. Это не позволит пользователю переназначить один виджет из одной компании в другую. Я полагаю, что для этого сценария нет правильного или неправильного ответа, все будет зависеть от конкретной ситуации, основанной на сценариях использования и системных требованиях.