使用http响应头来将服务器端错误从后端传递到前端

时间:2015-09-09 07:36:32

标签: rest spring-mvc servlets

我正在开发一个由javascript / ajax前端使用的REST后端。

我正在尝试找到一种方法来处理前端发送到后端的无效请求。

我遇到的一个问题是HTTP状态代码(例如{400409)的细微程度不足以涵盖业务逻辑错误,例如密码不匹配(在用户更改密码)或系统未知的电子邮件(如果用户尝试使用该应用程序登录)。

我正在考虑使用 HTTP响应标头,以便将服务器端错误从后端传递到前端。

我可以使用Error枚举(或带有常量的类),如下所示:

public enum Error {
 UNKNOWN_EMAIL,
 PASSWORDS_DONT_MATCH,
 //etc.
}

然后我会使用该枚举来为响应设置标题,如下所示:

response.setHeader(Error.UNKNOWN_EMAIL.name(), "true");

...并在前端适当处理错误。

可以改进上述架构吗?如果是这样的话?

我对HTTP响应标头的使用是否正确?

我应该使用常量还是枚举?

1 个答案:

答案 0 :(得分:1)

  

我对HTTP响应标头的使用是否正确?

我认为这不正确,但我更喜欢直接在响应正文中发送错误消息/代码。这通常对客户端访问更方便,更明确。作为使用每个响应的一部分,客户端可以检查错误的内容(您可能有多个)并相应地采取行动。以下是一个有点人为的例子:

// ...
{ 
    "errors": {
        "username": "not found"
        "password": "no match"
    }
    "warnings": {
        "account": "expired"
    }
}
// ...

以上是一个非常简单的方法 - 您的JSON消息可以像您希望的那样复杂,但请记住,您应该只公开客户端为实现其目标所需的信息。这还取决于您是为第三方/公共消费发布API还是仅为您自己的客户发布API,即。你自己的网站。如果你有其他各方消费它,那么就考虑一下,因为一旦你发布它然后你需要保持这种方式 - 否则你打破任何消费者。

查看JSON API以获取有关处理错误的标准化指导。

  

我应该使用常量还是枚举?

由于这些是一组相关的属性,因此枚举优于常量(我假设您使用的是Java)。