HTTP状态码 - 404NotFound vs 204NoContent vs 200Ok

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

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

这是我第一次使用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);
    }
}

很明显,如果公司没有找到,不管它是被软删除还是从来没有存在过,我应该返回404NotFound,正确吗?

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

404NotFound - 没有发现任何小部件。

204NoContent - 没有发现任何小部件,所以没有内容可返回。

200Ok与空阵列 - 没有发生Errors,但我们发现的是一个空数组,所以就返回这个数组。

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

是的,对于一个不存在的公司来说,404是正确的返回代码,因为如果你要返回一个成功代码,使用你的API的开发者将不得不为其添加额外的检查,或者你将不得不拿出假数据来满足请求。除此之外,大多数语言都有检查和处理错误状态码的简单方法。

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

真正的问题是一致性和简单性。大多数API总是会在这种情况下只使用代码200,并返回一个空数组,因为这样一来,使用API的开发人员就可以(通常)使用相同或类似的代码来处理请求,无论数组是否为空。如果你返回一个不同的状态代码(204),而不仅仅是一个空数组,使用你的API的开发者将不得不为其添加一个额外的检查,并且很有可能创建并返回一个空数组。另外,在你发布的代码中,也可以去掉额外的几行。

© www.soinside.com 2019 - 2024. All rights reserved.