在异常情况下处理Http请求

时间:2017-12-07 10:04:02

标签: java spring http

我有一个应用程序,后端是spring MVC,前端是angular.the服务器端向客户端发送数据。我的问题是,如果服务器端出现问题,处理它的最佳方法是什么。 我想2个解决方案: 第一个是创建包含3个属性的新模型

public class Response{ boolean hasError; Object data; Exception ex}

并将此对象发送到客户端,然后在客户端检查hasError是否等于false检查数据对象,否则检查异常对象。 此解决方案授予所有情况,http响应状态将来自服务器端200

第二个解决方案是为http响应创建自定义状态代码,然后在前端使用此状态代码来检测异常类型。

问题是这两种解决方案的最佳实践是什么? 或者是否有比这两种解决方案更好的解决方案?

2 个答案:

答案 0 :(得分:1)

<强> TL; DR:

使用Spring开箱即用的东西,并按照REST原则进行操作。 使用更通用的消息处理前端上的错误,以便在错误处理时只需要http状态代码就不需要自定义模型。

更长的版本:

无需重新发明轮子并编写自定义http代码。周围有很多,Spring对使用@ControllerAdvice@ExceptionHanlder注释处理异常提供了极好的支持。 Some referencequick guide

根据您的后端端点,您可以编写最符合您需要的各种异常类。尝试遵循REST原则,稍后您将感谢自己。 此外,无需将错误一直传播到前端。例如 - 如果后端发生了NullPointerException,请不要在前端向用户显示 Null指针发生,这对他没有任何帮助。

  

此解决方案授予所有情况,http响应状态将是来自服务器端的200

如果出现错误,请不要返回200,因为这会使调用者感到困惑。如果出现错误,请返回与发生的错误相对应的4xx5xx代码,然后独立于后端在前端处理该情况(例如,数据库已关闭,您将返回错误500到前端并让它向用户显示消息,例如服务暂时关闭,请稍后再试或类似的东西)。

答案 1 :(得分:1)

如果您使用的是基于微服务的架构,为什么不尝试使用Netflix hystrix容错库。它使用断路器模式,并允许微服务在相关服务失败时运行。