如何在RESTful API中处理异常以收集结果?

时间:2013-04-16 16:21:42

标签: api rest restful-url api-design

我们正在设计一个RESTful API来返回文档集合。我们的初始实现使用HTTP状态代码来指示是否无法满足请求。这似乎是一种被广泛接受的最佳做法(例如参见here)。

我们最近遇到了一个用户正在提取1000个文档的问题。其中一个文档检索失败,因此我们返回了HTTP 500状态代码。

另一种方法是返回HTTP 200状态代码,其中有效负载具有我们能够检索的999个文档,然后是错误集合,指示失败的那个。

这种替代方法是违反RESTful原则的吗?应如何处理这种情况?除了这两种方法之外还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

是的,我认为只要您记录要返回的数据,就可以包含“错误”集合,这是完全可以接受的。这意味着无论您使用什么语义媒体类型来描述这个文档集合,都应该有文档来描述文档集合应该是什么样的,以及错误集合应该是什么样子。然后,客户可以决定如何处理此信息。

例如,如果您将此作为JSON(仅作为示例)返回,则可能具有类似application/json+documents或类似内容的媒体类型,如下所示:

{ data : {
    documents: [ ... ], //document objects
    errors: [ ... ] //error objects
}

然后,您将拥有描述文档外观的文档以及错误的外观。在真正的RESTful API中,它是记录的媒体类型而不是调用,因为在真正的RESTful API中只有一个端点,而其他所有内容都是通过该初始端点与语义媒体类型一起“发现”的。因此,只要您记录错误是可能的,并且您描述了错误将被传递的格式,您应该没问题。

这也不是一个“例外”条件,因为在您的情况下似乎可以预见客户可能无法检索所有文件。因此,可以告知客户这一事实。

答案 1 :(得分:1)

有时您必须在这样一个独特的情况下交叉:涉及用户。

通知用户有效负载太大并返回内部服务器错误并非不合理。