【问题标题】:What is the best ERROR model for RESTREST 的最佳错误模型是什么
【发布时间】:2014-11-04 23:50:00
【问题描述】:

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

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

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

在我看来,这又是一辆自行车,因为现场验证是我们这个时代的标准要求,所以我想知道是否已经有一个错误模型,我可以在我的项目中重用它。

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

【问题讨论】:

  • 您必须使用 HTTP 状态代码和消息(也称为自描述消息约束),并且在正文中您可以以更具体的方式描述错误,例如带有多语言错误消息和自定义错误代码。请注意,错误消息会发送给最终用户,他们并不关心确切的异常类型等...您可以通过调试模式向开发人员发送扩展错误消息。
  • 我在询问错误主体的模型:) 现在我看到 2 个分类 - 字段错误、逻辑错误,基本上我在问什么是更大的图景,除了字段错误之外还缺少什么& 全局错误。
  • 我认为缺少将客户端与服务实现分离的标准。 Hydra 确实有一个。如果您要问的话,我不知道其他错误类型。对于字段错误,您显然必须使用一些 CompositeException,对于一般错误,您必须使用一个简单的异常。之后,您必须将其转换为 json、xml 等……仅此而已。我认为这并不难。

标签: spring rest architecture restful-architecture


【解决方案1】:

我通常做的是创建一个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 可以轻松获取字段的错误。从JsonMappingException 等异常中挖掘错误需要做更多工作。

【讨论】:

    【解决方案2】:

    大概最好的方法是在服务器和客户端上都进行验证。由于我对 Spring 不熟悉,因此我的建议仅限于客户:Backbone 确实有一个 validate 方法可用于您的 Backbone 模型。 The Backbone docs 鼓励您使用自己的验证逻辑覆盖此方法。 validate 在你做一个主干模型save(即POST)时默认被调用,你也可以在你想运行验证代码时触发invalid事件(例如,在按键之后,之前用户点击提交按钮)。

    如果您不热衷于编写大量自定义前端验证,可以使用一些插件,例如 backbone.validation

    【讨论】:

    • 谢谢,已经在使用backbone.validation,这是一个很棒的库。我希望最终获得错误消息的透明度,无论是客户端验证还是服务器验证错误,这意味着我需要能够将服务器错误转换为骨干验证错误,但我宁愿重用现有模型,而不是发明轮子:)
    猜你喜欢
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2013-06-16
    • 1970-01-01
    相关资源
    最近更新 更多