什么是特定异常的正确 HTTP 状态代码答案

Posted

技术标签:

【中文标题】什么是特定异常的正确 HTTP 状态代码答案【英文标题】:Whats the correct HTTP status code answer for specific Exceptions 【发布时间】:2019-03-31 15:35:37 【问题描述】:

我正在使用用于 MVC 5 的 ASP.NET Web API 在 C# 中创建一个 REST Web API。

我创建了一个抽象类 BaseApiController,所有 API 控制器都对其进行了扩展。在这个基本控制器中,我处理所有异常以及控制器正常工作所需的一切。

我已经为以下异常实现了异常处理:

    public override async Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
    
        string controllerName = null;
        string actionName = null;

        try
        
            SetContext(controllerContext);
            SetServices();

            await AuthenticateUser();

            controllerName = controllerContext?.Controller?.GetType().FullName;
            var services = controllerContext?.ControllerDescriptor?.Configuration?.Services;
            actionName = services?.GetActionSelector()?.SelectAction(controllerContext)?.ActionName;

            return await base.ExecuteAsync(controllerContext, cancellationToken);
        
        catch (HttpResponseException e)
        
            ClientDataService.Logger(e, $"controllerName.actionName",
                $"Response -> Status Code: (int)e.Response.StatusCode, Reason: e.Response.ReasonPhrase",
                SystemLogOriginTypesEnum.WEBSITE_API);

            throw;
                    
        catch (Exception e)
        
            ClientDataService.Logger(e, $"controllerName.actionName",
                $"Response -> Status Code: (int)HttpStatusCode.InternalServerError, Reason: Internal server error",
                SystemLogOriginTypesEnum.WEBSITE_API);

            throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
            
                Content = new StringContent("Internal server error"),
                ReasonPhrase = "Internal server error"
            );
        

控制器抛出 HttpResponseException 主要是在未传递或未正确设置强制参数时(HTTP 状态代码 400),第二个是出现严重错误(HTTP 状态代码 500)。

我的问题是,当服务抛出 NotSupportedException 或自定义 InvalidSortAttributeException 等异常时,API 应该响应哪种 HTTP 状态代码?

我不是指 HTTP 状态类别,即 4XX 与 5XX,因为 InvalidSortAttributeException 应该是 4XX 类别,因为错误是从无效请求引发的,可能是 400(错误请求)!?

虽然第二个,我相信可能属于这两个类别,因为服务器不支持请求,但这并不完全意味着它将来不会支持它,可能是 406(不可接受)或 501(未实现)?

【问题讨论】:

Http status code for Exceptions的可能重复 我不认为这是重复的,因为在链接的帖子中只讨论了 HTTP 错误类别。主要是何时使用 4XX 与 5XX。我已经接受了 4XX 类别应该至少用于 InvalidSortAttributeException,因为它是当用户发送错误的排序属性时引发的错误,也许 NotSupportedException 可能是 5XX。不过,我更关注应该使用或在类似情况下最常使用的特定错误。 【参考方案1】:

4XX 专为用户错误而构建 5XX 是为内部服务器错误而构建的

您必须使用场景的智能代码进行响应。如果存在不受支持的异常,但您的代码调用者构建了不受支持的场景,则为 500。如果用户设法将错误请求放在一起,则应为 4XX。

另请注意,JSON 请求中缺少属性 (400) 与 url 中缺少值 (404) 或资源不再可用 (404) 之间存在差异。

【讨论】:

感谢@c-bauer 的回复。根据您的回复,我将两者都更改为 400(错误请求),因为两者都是基于客户端使用 API 发出的请求。这意味着他要求的东西至少现在还不存在。 很高兴能帮助到@PedroPinto。如果您认为这是对您的问题的良好回答,您可以将其标记为答案,或者在您需要更多反馈时将其保持打开状态。

以上是关于什么是特定异常的正确 HTTP 状态代码答案的主要内容,如果未能解决你的问题,请参考以下文章

取消请求的正确 HTTP 状态代码是啥

未找到搜索结果的正确 HTTP 状态代码是啥?

异常处理

PHP 异常处理

http状态返回代码400怎么解决

PHP 异常处理