如何处理rest api批量操作中的错误?

问题描述 投票:0回答:1

我希望我的 API 能够执行批量操作。在这种情况下,它应该创建多个。 我偶然发现的一个问题是如何处理这种情况下的错误。

以下是所发生事件的概要:

客户端发出带有实体列表的发布请求。 API 获取这些实体并验证这些实体的字段和关系。 如果发生一个或多个错误(例如,如果在数据库中找不到引用),操作将被取消并回滚。

我该如何处理这个问题? 我知道多状态有一个http状态。我用这个吗? 对于可以创建但由于另一个实体失败而无法创建的实体,我将使用什么错误代码? 这里的最佳做法是什么?

我尝试用谷歌搜索这个案例,但找不到真正的答案。有一些关于处理错误的博客,但如果我发现的博客专门讨论了我的问题,则没有。

如果它很重要:我正在使用 spring boot 2.7 和 kotlin

spring-boot error-handling batch-processing
1个回答
1
投票

我该如何处理这个问题?我知道多状态有一个http状态。我用这个吗?对于可以创建但由于另一个实体失败而无法创建的实体,我将使用什么错误代码?这里的最佳实践是什么?

您想要向客户端报告的错误的所有细粒度细节都属于响应正文。

状态代码是通过网络传输文档域的元数据;它向其他通用 HTTP 响应消费者传达响应的语义,以便他们可以采取适当的智能操作。

我不鼓励使用 207 Multistatus,除非您故意尝试创建 WebDAV 外观(请参阅 RFC 4918 等)

由于失败与请求中的实体列表有关,因此我们通常应该使用 registered 4xx client 错误之一。

我通常会从 403 Forbidden 开始(服务器理解所询问的内容,但由于原因选择不这样做)。

要考虑的替代方案是400错误请求(不是我的偏好,因为它对服务器是否理解请求不明确),409冲突(不一定不合理,特别是如果客户端有办法解决问题), 422 无法处理的内容(这不是我的偏好,因为有效负载的语义是正确的)。

在实践中,我认为您会发现这些响应中的任何一个都是很好,因为通用 HTTP 组件不会以任何重要的方式区分这些代码。

因此,您可能会合理地考虑其他因素来做出选择 - 如果我们在这里使用不同的代码,这是否会让您关心的人的生活变得更轻松? 例如,您的操作员可能更喜欢您在这种情况下使用与禁止访问不同的错误消息语义,因为监视。 这很好

© www.soinside.com 2019 - 2024. All rights reserved.