是否存在REST服务的标准错误消息模型?
我正在使用Spring REST后端和基于Backbone JS的前端构建REST服务。在所有项目中,我在那里有一些自制的错误消息机制,自制客户端解释这些错误。这通常对这个特定项目的范围和用途有限。
现在在我当前的项目中,我想到了一点,我想在POST请求中为无效的JSON字段引入字段错误。所以我需要扩展我的模型来支持这个。
从我的角度来看,它是另一种自行车,因为现场验证是我们日常的标准要求,所以我想知道,如果已经存在错误模型,我可以在我的项目中重复使用。
我熟悉Spring中的HandlerExceptionResolver和Java中的@Valid注释。事实上我正在使用它们分配。这更像是一种架构问题,将这种错误传递给独立的JS客户端的最佳模型是什么。
答案 0 :(得分:4)
我通常做的是创建一个ValidationError
模型。在验证错误的情况下,模型以JSON的形式返回给客户端,以及HTTP状态代码,它包含客户端需要知道的有关错误的所有内容。
模型的细节有所不同,但这样的事情将是一个良好的开端:
public class ValidationError {
private int code;
private String message;
private Map<String, String> fields;
/*...*/
}
现在提交无效表单时,JSON响应将类似于:
{
"code": 400,
"message": "invalid form value(s)",
"fields": {
"username": "the username already exists",
"password": "password must be more than 6 characters"
}
}
这与Spring的@ExceptionHandler
很好地联系在一起。当你得到像BindException
这样的东西时,你所要做的就是:
@ExceptionHandler(BindException.class)
@ResponseBody
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
private ValidationError handleBindException(BindException ex) {
ValidationError validationError = new ValidationError();
/* set code and message */
for (FieldError error : ex.getFieldErrors()) {
/* set fields' errors */
}
return validationError;
}
BindException
可以轻松获取字段&#39;错误。需要做更多的工作来挖掘JsonMappingException
等异常中的错误。
答案 1 :(得分:1)
据推测,最好的方法是在服务器和客户端上进行验证。我将我的建议限制在客户端,因为我不熟悉Spring:Backbone确实有一个validate
方法可用于Backbone模型。 The Backbone docs鼓励您使用自己的验证逻辑覆盖此方法。默认情况下,只要您执行骨干模型validate
(即POST),就会调用save
,并且只要您想运行验证代码,您也可以触发invalid
事件(例如,之后)在用户点击提交按钮之前进行加密。
如果您不热衷于编写大量自定义前端验证,则可以使用一些插件,例如backbone.validation。