对于用户提交的无效数据,适当的HTTP响应是什么?


What's the appropriate HTTP response for invalid data submitted by the user?

我正在尝试JSON和http响应代码。我正在通过AJAX请求提交表单,显然需要验证服务器端的数据。

我的想法是响应"200 OK"响应(以确认消息作为正文),如果帖子成功。如果用户发送的数据无效,我不知道该如何响应

您可以发送400: Bad Request标头。如果这不是你的菜,也许可以检查一下W3C的状态码定义?

只需实现JSON-RPC之类的标准协议即可。它有错误处理,参数传递等。

请求:

{"method": "postMessage", "params": ["Hello all!"], "id": 99}

反应:

{"result": 1, "error": null, "id": 99}

和错误:

{"result": null, "error": "Duplicate Message", "id": 99}

很灵活,标准

发送回一个JSON对象:

$message = array(
   'error' => true,
   'code' => 'some error number relevant to you',
   'message' => 'A nice human-readable+relevant error message'
);
echo json_encode($message);

我更喜欢用这种方式向服务发送错误信号。摆弄HTTP状态码似乎是不对的,因为实际的HTTP请求本身的一切都工作得很好——只是请求不符合服务的期望。

下面是HTTP状态码的完整列表。针对您的情况,首先想到的是400 Bad Request,但这通常用于表示HTTP语法中的错误,而不是正文内容中的错误。不过,如果没有更多的信息,我还是选那个。

在特定情况下,根据您接收到的数据的确切性质,我可以看到403、404、410、413或其他任何响应。

取决于API的用途。如果它是你的(私有),那么按照nightfirerecat的建议用HTTP状态400回答。如果它是一个公共API,发送一个有意义的错误消息来帮助开发人员。

400(通用),或者如果您想更具体:http://greenbytes.de/tech/webdav/rfc4918.html#STATUS_422

我通常看到这样做的方式是让HTTP响应代码用于与HTTP协议相关的事情,而不是用于应用程序错误。然后,从HTTP响应返回指示成功或失败的JSON和任何所需的返回数据。例如,您可以返回如下内容:

{
    statusCode: 0,     // 0 = successful, negative value = error code
    statusMsg: "success",   // you can put any human readable status msg here
    data: {
        confirmationMsg: "Data sent successfully."
    }
}

然后,查看响应的代码首先查看statusCode,并根据此操作是否成功,查找其他数据。

如果您想象调用者将如何使用此响应,我发现为应用程序级错误和传输级错误设置不同的代码路径是很有价值的。如果你考虑jQuery.ajax()呼叫。当http状态码是成功代码时,将调用成功处理程序。当http状态码不成功时,将调用错误处理程序。通过这种方式,您可以使用一个ajax错误处理程序为所有传输级错误提供通用错误处理程序,然后您可以通过检查返回的JSON中的应用程序级状态代码将特定的应用程序级错误处理程序放入成功处理程序中。如果使用错误400,则必须为每个ajax调用编写完全不同的错误处理程序,以处理传输错误和应用程序级别的错误。