当前位置: 首页 > 知识库问答 >
问题:

所有HTTP错误响应都应该具有相同的JSON结构吗?

徐飞龙
2023-03-14

我们正在用Spring Boot开发一个REST服务,并陷入了困境,想知道是否每个错误响应都应该具有相同的JSON结构?

对于错误情况,我们的服务使用简单的JSON格式进行响应。例如,如果参数格式错误,我们将以HTTP状态400和JSON响应:

{
  "errorCode": 05,
  "message": "provided paramter XY is malformed"
}

errorCode是我们的自html" target="_blank">定义代码id。人们可能会争论这种设计是否好,但它很简单,服务消费者可以轻松处理。

现在,Spring Boot会自动创建一些错误响应。例如,对于一个TypeMismatchExc0019和具有HTTP状态的响应400被创建。但是当然,这些自动生成的响应不具有错误格式。

所以我们遇到的情况是,服务消费者事先不知道HTTP状态400的正文中是否有简单的JSON错误格式。我们真的应该覆盖所有Spring Boot默认异常处理,以便在每个响应中使用我们的格式,还是服务消费者应该吞下苦果,确定是否使用了简单的JSON格式?

共有1个答案

潘智刚
2023-03-14

这取决于你项目的规模。如果您的API被许多应用程序使用,您应该采用“捕获一切并使用JSON格式”的方法。是的,你会有更多的事情要做,但是当你公司的其他应用程序都可以使用你的标准方式时,他们可以节省很多时间。

在我参与的大多数项目中,我们也有一个“标准方式”来回复我们的错误响应(也是JSON):

@RestControllerAdvice
public class GlobalResourceExceptionHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(GlobalResourceExceptionHandler.class);

    // the class ValidationError contains the properties the json should contain.
    @ExceptionHandler(Exception.class)
    public List<ValidationError> exceptionHandler(Exception e, HttpServletResponse response) {
        LOGGER.warn("Exception thrown in a resource", e);
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        return Collections.singletonList(new ValidationError(null, "unexpected exception"));
    }
}

您可以使用更多的@ExceptionHandlers扩展该类。

事实证明,这是一个非常好的方法,因为它易于实现(也适用于小型应用程序),并且涵盖了很多内容。很多基本上意味着与Rest请求有关的一切。排除在外的是一个资源处理程序,它提供了一个角应用程序和安全层。

更新:结论:当你有一个被许多应用程序使用的api时,抓住一切。在这两种情况下(小应用或大应用),您都应该使用上面所示的方式开始错误处理。

 类似资料:
  • 问题内容: 我有一个使用AngularJS和服务器端后端构建的应用程序,该后端以JSON形式传递所有请求。每个请求都包装在一个JSON容器中,该容器包含一个数据变量,该变量包含特定于该请求的数据。其他数据用于保持应用程序内的状态和控制,检查错误和成功消息以及检查会话标志。所有其他变量都随EVERY请求一起提供,并且在数据变量之前先进行检查。 现在,我有一种方法可以先检查JSON响应的内容,然后再检

  • 我使用流畅的断言来验证不同的测试对象 注意:这不是代码的精确副本,原始DTO中有更多字段,但没有必要解释问题 我正在创建一个函数来断言它们是相等的,我正在尝试使用流畅的断言来做到这一点。我想不出一种方法来说Id映射到键。 注意:我知道,作为一种替代方法,我可以通过压缩有序集合并比较每个属性来实现这一点,但对于更长的DTO来说,这将很难对每个属性进行比较。 有没有人知道一种在Shouldallbee

  • 目前,我有一个类分数,它允许我用三种不同的方式创建分数 对于一个整数,在这种情况下,给定的整数将是分子,分母将设置为1 有2个整数,分子和分母 最后一种方法是解析一个字符串,该字符串必须与REGEX-?\d/[1-9]\d* gcd将尽可能减少生成的分数。 我现在想实现的是,具有相同分子和分母的分数实例具有相同的引用例如。 应该返回true。 我研究了一些关于泛型和边界的章节,但我不确定这是否是我

  • 我正在努力裁剪javax。验证。ConstraintValidator和javax。验证。根据我的需要限制ValidatorContext。我从格式错误的请求正文收到的响应消息始终采用以下形状: <代码> 此消息也以500而不是400错误请求的形式返回。我无法获得工作到解决方案来执行以下操作: 仅包括<代码> 我有以下代码: 向上面的代码发送格式错误的有效负载将导致如下消息: 我希望能够收到以下信

  • 我已经为基于 Debian 的系统创建了一个 Java 应用程序的 DEB 安装程序。在我的 DEB 软件包中,我使用一个 *.桌面文件,如下所示: 一切正常,我的应用程序安装良好,运行良好。但我注意到了一件非常奇怪的事情:在Ubuntu上首次运行我的应用程序后,整个系统中所有其他名为“java”的进程现在都有图标,我在*中指定了这个图标。桌面文件。这是Ubuntu bug吗?这是我的安装程序中的

  • 问题内容: 我发现以下两项工作: 所有Python类都应该扩展对象吗?不扩展对象是否存在任何潜在问题? 问题答案: 在Python 2中,不继承自将创建一个旧式类,除其他效果外,该类还会产生不同的结果: 与 同样,多重继承的规则也有所不同,在这里我什至不尝试总结。我所见过的有关MI的所有好的文档都描述了新型类。 最终,旧式类在Python 3中消失了,并且继承自隐式了。因此,除非您需要与旧软件向后