HTTP状态码-401 / NotAuthorized与404 / NotFound与400 / BadRequest

时间:2020-04-27 17:37:02

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

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

这是我第一次通过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小部件55”,但“小部件55”属于“公司2”,我应该返回什么?

404 / NotFound -由于“小部件55”属于“公司2”,因此即使“小部件55”确实存在,上述LINQ语句也不会找到任何内容。

401 /未授权-由于“小部件55”不属于“公司1”,因此“公司1”无权查看。

400 / BadRequest -这只是一个错误的请求,因为Widget和Company不匹配。

顺便说一句,有人可以推荐一个好的资源来帮助我解决其他类似情况吗?

1 个答案:

答案 0 :(得分:2)

出于以下两个原因,我将返回404:

  1. 在我看来,404不是指<Switch>,而是指整个资源URI:import matplotlib.pyplot as plt import numpy as np xval = [np.array([0, 1, 2, 3, 4]), np.array([5, 6, 7, 8, 9, 10]), np.array([11, 12, 13, 14, 15, 16, 17])] all_runs = [np.random.randint(1, 10, len(xv)) for xv in xval] total_len = sum([len(xv) for xv in xval]) for ses in range(len(all_runs)): if len(all_runs[ses]) > 0: plt.plot(xval[ses], all_runs[ses], '.-', color='tab:blue') # if ses > 0: # plt.axvline(xval[ses][0] - 0.5, ls=':', lw=1, color='purple') plt.xticks(range(total_len), [i for xv in xval for i in range(len(xv))]) ax = plt.gca() ax.set_xticks([xv[0] + 0.1 for xv in xval if len(xv) > 0], minor=True) ax.set_xticklabels([f'session {i}' for i, xv in enumerate(xval) if len(xv) > 0], minor=True) ax.tick_params(axis='x', which='minor', length=0, pad=18) for tick in ax.xaxis.get_minor_ticks(): tick.label1.set_horizontalalignment('left') plt.show() 。该资源不存在。
  2. A 403阻止公司1查看公司2的窗口小部件,但确实暴露了Widget/55存在的事实。您可能会接受也可能不会接受。 According to the World Wide Web Consortium (W3C),“如果服务器不希望将此信息提供给客户端,则可以改用状态代码404(未找到)。”