【问题标题】:HTTP Status Codes - 404/NotFound vs 204/NoContent vs 200/OkHTTP 状态代码 - 404/Not Found vs 204/No Content vs 200/Ok
【发布时间】:2020-04-28 06:43:21
【问题描述】:

我有属于公司实体的小部件实体。 Companies 和 Widget 之间存在一对多的关系。

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

[Route("MyApi/Companies/{companyId}/WidgetAdministration/[controller]")]
[HttpGet]
public async Task<ActionResult<List<WidgetDTO>>> GetWidgets([FromRoute] int companyId)
{
    // get company
    var company = await _xyvidContext.Companies
        .Where(c => c.CompanyId == companyId)
        .AsNoTracking()
        .Include(c => c.Widgets)
        .FirstOrDefaultAsync();

    if (company == null)
    {
        return NotFound();
    }

    // get corresponding Widgets
    List<WidgetDTO> widgetDtos = company.Widgets
        .AsQueryable()
        .ProjectTo<WidgetDTO>(_mapper.ConfigurationProvider)
        .ToList();

    if (widgetDtos == null)
    {
        return StatusCode(Microsoft.AspNetCore.Http.StatusCodes.Status500InternalServerError);
    }
    else if (widgetDtos.Count == 0)
    {
        return NoContent();
    }
    else
    {
        return Ok(widgetDtos);
    }
}

很明显,如果公司未找到,无论是软删除还是从未存在,我都应该返回 404/NotFound,对吗?

如果我请求查看属于公司 1 的所有小部件,但公司 1 没有小部件,我应该返回什么?

404/NotFound - 未找到任何小部件。

204/NoContent - 未找到小部件,因此没有要返回的内容

200/Ok with Empty Array - 没有发生错误,但我们发现的是一个空数组,所以只需返回它。

【问题讨论】:

    标签: c# get api-design http-status-codes


    【解决方案1】:

    是的,对于不存在的公司,404 将是正确的返回代码,因为如果您要返回成功代码,使用您的 API 的开发人员必须为此添加额外的检查,否则您将不得不来用假数据来满足请求。最重要的是,大多数语言都有简单的方法来检查和处理错误状态代码。

    至于小部件,因为它是一个数组,这完全取决于您。虽然,4xx 代码表示错误。正因为如此,我个人建议使用 204 或 200,因为 2xx 表示成功。如果他们尝试检索不存在的公司的小部件列表,则 404 会更合适。

    真正归结为一致性和简单性。在这种情况下,大多数 API 将始终只使用代码 200 并返回一个空数组,因为使用该 API 的开发人员可以(通常)使用相同或相似的代码来处理请求,无论该数组是否为空。如果您返回不同的状态代码 (204) 而不仅仅是一个空数组,那么使用您的 API 的开发人员将不得不为此添加额外的检查,并且很可能无论如何都会创建并返回一个空数组。此外,它还消除了您发布的代码中额外的几行代码。

    【讨论】:

    • 谢谢,澄清一下,如果没有找到公司,我将使用 404,如果有效公司不包含小部件,我将使用 200 和空数组。您说服了我,仅使用 200 就可以让前端开发人员更轻松一些。
    猜你喜欢
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 2016-10-24
    • 2022-10-25
    • 2012-09-30
    相关资源
    最近更新 更多