HTTP 状态代码 - 404/未找到与 204/无内容与 200/确定
HTTP Status Codes - 404/NotFound vs 204/NoContent vs 200/Ok
我有属于 Company 实体的 Widget 实体。 Companies 和 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);
}
}
很明显,如果找不到公司,无论是软删除还是根本不存在,我都应该 return 404/NotFound,正确吗?
如果我要求查看属于公司1的所有Widget,但公司1没有Widget,我应该怎么办return?
404/NotFound - 未找到小部件。
204/NoContent - 未找到小部件,因此 return
没有内容
200/Ok with Empty Array - 没有发生错误,但我们发现的是一个空数组,所以只是 return。
是的,对于一家不存在的公司,404 将是正确的 return 代码,因为如果您要 return 一个成功代码,使用您的 API 的开发人员会必须为此添加额外的检查,否则您将不得不提供虚假数据来满足请求。最重要的是,大多数语言都有简单的方法来检查和处理错误状态代码。
至于小部件,因为它是一个数组,这完全取决于您。虽然,4xx 代码表示错误。正因为如此,我个人建议使用 204 或 200,因为 2xx 表示成功。如果他们试图检索不存在的公司的小部件列表,则 404 会更合适。
真正归结为一致性和简单性。在这种情况下,大多数 API 将始终只使用代码 200 和 return 一个空数组,因为使用 API 的开发人员可以(通常)使用相同或相似的代码来处理请求数组是否为空。如果您 return 一个不同的状态代码 (204) 而不仅仅是一个空数组,使用您的 API 的开发人员将不得不为此添加一个额外的检查并且很可能会创建和 return 无论如何都是一个空数组。此外,它还删除了您发布的代码中的额外几行。
我有属于 Company 实体的 Widget 实体。 Companies 和 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);
}
}
很明显,如果找不到公司,无论是软删除还是根本不存在,我都应该 return 404/NotFound,正确吗?
如果我要求查看属于公司1的所有Widget,但公司1没有Widget,我应该怎么办return?
404/NotFound - 未找到小部件。
204/NoContent - 未找到小部件,因此 return
没有内容200/Ok with Empty Array - 没有发生错误,但我们发现的是一个空数组,所以只是 return。
是的,对于一家不存在的公司,404 将是正确的 return 代码,因为如果您要 return 一个成功代码,使用您的 API 的开发人员会必须为此添加额外的检查,否则您将不得不提供虚假数据来满足请求。最重要的是,大多数语言都有简单的方法来检查和处理错误状态代码。
至于小部件,因为它是一个数组,这完全取决于您。虽然,4xx 代码表示错误。正因为如此,我个人建议使用 204 或 200,因为 2xx 表示成功。如果他们试图检索不存在的公司的小部件列表,则 404 会更合适。
真正归结为一致性和简单性。在这种情况下,大多数 API 将始终只使用代码 200 和 return 一个空数组,因为使用 API 的开发人员可以(通常)使用相同或相似的代码来处理请求数组是否为空。如果您 return 一个不同的状态代码 (204) 而不仅仅是一个空数组,使用您的 API 的开发人员将不得不为此添加一个额外的检查并且很可能会创建和 return 无论如何都是一个空数组。此外,它还删除了您发布的代码中的额外几行。