如果 REST API 方法失败,我应该返回 200、400 还是 500 HTTP 状态消息?

Posted

技术标签:

【中文标题】如果 REST API 方法失败,我应该返回 200、400 还是 500 HTTP 状态消息?【英文标题】:If a REST API method fails, should I return a 200, 400, or 500 HTTP status message? 【发布时间】:2012-03-09 21:04:30 【问题描述】:

当用户向我的 API 提交无效数据(通常通过 javascript + JSON)时,我想知道我应该回复哪个 HTTP response code。

我应该返回带有错误的 HTTP 200 响应 - 还是我的服务器应该响应 400 或 500 错误,因为请求实际上由于某些错误数据而未能通过我的验证?

似乎 400 错误是要走的路,因为“4xx 类状态代码适用于客户端似乎出错的情况”-wikipedia

但是,要记住的一件事是,大多数人使用像 jQuery 这样的框架,当 AJAX 请求以 200 以外的任何状态代码响应时,它要求您指定备用回调。

【问题讨论】:

400 是“正确”的方式,200 是“礼貌”的方式。你选择。 REST HTTP status codes的可能重复 非常有趣的问题目前我返回一个空的 json 对象,但这可能不对,查看最接近的 HTTP 响应代码将接缝为 400(错误请求),有兴趣阅读其他人对此的看法. @JoachimIsaksson 提出了一个很好的观点。 400 在技术上是正确的方法,但另一方面,期望客户端处理我们可能会或可能不会向他们抛出的每一个 HTTP 代码似乎并不正确。总是返回 200 并在返回的 JSON 中提供“errorCode”字段似乎更好。对于不存在的 API 方法,异常可能是 404。 如果提交了错误的密码怎么办?数据本身还不错... 4XX 或 200 + 错误? 【参考方案1】:

400 Bad Request 由于语法错误,服务器无法理解该请求。客户端不应该不加修改地重复请求。

在 jquery ajax 调用中使用 statusCode:

<html>
<head>
<title>jquery testing</title>
<script type="text/javascript" src="jquery-1.6.2.min.js"/>"></script>
<script language="javascript">
$(document).ready(
    function()
        $('#linkClick').click(
            function()
                    $.ajax(
                        url: 'a.html',
                        data: ,
                        type: 'get',
                        dataType: 'json',
                        statusCode: 
                            404:function()  alert("404"); ,
                            200:function()  alert("200"); ,
                            201:function()  alert("201"); ,
                            202:function()  alert("202"); 
                        ,
                        success: function(data) 
                            alert( "Status: " + data);
                        
                    );
                ); 
        
        );
</script>
</head>
<body>
<a href="#" id="linkClick">click</a>
</body>
</html>

【讨论】:

期望客户端处理每一个状态代码似乎很沉重。 非常好的客户回答 horaceman。但是,由于@Laurent,似乎有一个有效的观点。也许正确和现实之间的一个愉快的媒介是只实现几个覆盖所有基础的状态代码。 500、400、404 和 200 应该可以胜任。客户端只需要实现 400 和 200。在代码投入生产之前应注意 404,否则,默认错误处理程序会捕获实际的服务器错误 (500)。 @this.lau_ 您不需要处理每个错误代码。一个简单的code != 200 就足够了。但大多数时候,我希望客户愿意向用户提供有意义的反馈。 其他 20x 代码,比如 201 呢?支票不应该是code &gt;= 200 &amp;&amp; code &lt; 300吗?这些都是成功的结果,AFAIK

以上是关于如果 REST API 方法失败,我应该返回 200、400 还是 500 HTTP 状态消息?的主要内容,如果未能解决你的问题,请参考以下文章

REST API 服务针对验证失败返回啥适当的 HTTP 状态代码?

REST GET 在 Future Builder 中返回无效参数

Rest api在chrome中返回“网络连接失败”,但在firefox中工作正常

PayPal 从 IPN 到 REST API 的过渡

在带有 HTTP 状态代码 405 的 REST API 中返回啥错误消息?

无法在 SpringBoot 中使用 ControllerAdvice 返回 rest api 响应