我有属于Company实体的Widget实体。公司和小部件之间存在一对多的关系。
这是我第一次使用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();
}
}
基本上有两件事可能出错。
第一-小部件不属于公司。
如果发生这种情况,我相信我需要返回404 / NotFound。从我之前提出的问题中,我确信如果我要获取“公司1”“小部件55”,但“小部件55”不属于“公司1”,那么404 / NotFound是正确的响应。 404不是指Widget / 55,而是指整个资源URI:Company / 1 / Widget / 55。我假设相同的逻辑将适用于PUT和GET。
第二个-公司不存在
这有点困难。可以是:
404 / NotFound -遵循FIRST错误情况下的逻辑。
400 / BadRequest -因为用户做了他们不应该做的事情,这试图更新不属于该公司的小部件。 (此外,我在PluralSite视频中看到了这一点)
有什么想法吗?
此外,此外,如果参数ID与DTO中的ID不匹配,我们确定我们将简单地覆盖DTO中的值。这将防止用户将一个小部件从一个公司重新分配给另一公司。我相信,对于这种情况,没有正确或错误的答案,所有情况都将根据用例和系统要求,视具体情况而定。