HTTP状态代码-PUT-404 / NotFound与400 / BadRequest

时间:2020-05-04 19:14:40

标签: http-status-code-404 http-status-codes http-status-code-400 http-put

我有属于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中的值。这将防止用户将一个小部件从一个公司重新分配给另一公司。我相信,对于这种情况,没有正确或错误的答案,所有情况都将根据用例和系统要求,视具体情况而定。

0 个答案:

没有答案