什么是REST的最佳ERROR模型

时间:2014-11-03 17:12:01

标签: spring rest architecture restful-architecture

是否存在REST服务的标准错误消息模型?

我正在使用Spring REST后端和基于Backbone JS的前端构建REST服务。在所有项目中,我在那里有一些自制的错误消息机制,自制客户端解释这些错误。这通常对这个特定项目的范围和用途有限。

现在在我当前的项目中,我想到了一点,我想在POST请求中为无效的JSON字段引入字段错误。所以我需要扩展我的模型来支持这个。

从我的角度来看,它是另一种自行车,因为现场验证是我们日常的标准要求,所以我想知道,如果已经存在错误模型,我可以在我的项目中重复使用。

我熟悉Spring中的HandlerExceptionResolver和Java中的@Valid注释。事实上我正在使用它们分配。这更像是一种架构问题,将这种错误传递给独立的JS客户端的最佳模型是什么。

2 个答案:

答案 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