HTTP状态码 - 401NotAuthorized vs 404NotFound vs 400BadRequest

问题描述 投票:0回答:1

我有属于公司实体的Widget实体。 公司和Widgets之间是一对多的关系。

这是我第一次使用Get方法。

[Route("MyApi/Companies/{companyId}/WidgetAdministration/[controller]")]
[HttpGet("{widgetId}")]
public async Task<ActionResult<WidgetDTO>> GetWidget([FromRoute] int companyId, [FromRoute]int widgetId)
{
    WidgetDTO widgetDto = await _myContext.Widgets
        .Where(w => w.CompanyId == companyId && w.WidgetId == widgetId)
        .AsNoTracking()
        .ProjectTo<WidgetDTO>(_mapper.ConfigurationProvider)
        .FirstOrDefaultAsync();

    if (widgetDto == null)
    {
        return NotFound();
    }
    else
    {
        return Ok(widgetDto);
    }
}

如果一个关联到 "公司1 "的用户请求 "公司1 Widget 55",但 "Widget 55 "属于 "公司2",我应该返回什么?

404NotFound - 由于 "Widget 55 "属于 "Company 2",所以即使 "Widget 55 "真的存在,上述LINQ语句也不会找到任何东西。

401NotAuthorized - 由于 "Widget 55 "不属于 "公司1","公司1 "无权查看。

400BadRequest - 这只是一个不好的要求,因为Widget和Company不匹配。

顺便说一句,谁能推荐一个好的资源来帮助我解决其他类似的情况?

c# get api-design http-status-codes
1个回答
2
投票

我会返回404,有两个原因。

  1. 在我看来,404指的不是 Widget/55但对整个资源URI。Company/1/Widget/55. 该资源不存在。
  2. 403阻止公司1查看公司2的小工具,但它确实暴露了这样一个事实,即 Widget/55 存在。你可能会接受,也可能不会接受。根据万维网联盟(W3C)的规定。"如果服务器不希望向客户端提供这些信息,可以使用状态码404(未找到)代替。"
© www.soinside.com 2019 - 2024. All rights reserved.