HTTP状态码-404 / NotFound与204 / NoContent与200 / Ok

时间:2020-04-27 21:27:50

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

我有属于Company实体的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 /未找到-找不到小组件。

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

200 / OK,带有空数组-没有错误发生,但是我们发现是一个空数组,因此只需将其返回即可。

1 个答案:

答案 0 :(得分:1)

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

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

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

相关问题