处理API的多个响应代码的好方法是什么?

时间:2016-02-19 19:59:27

标签: api rest http http-status-codes

考虑调用REST API:

POST /employees 
[{ "name":"joe", "job":"dev",
 { "name":"bob" }]

对于每个数组元素,将创建一个员工。但是,job是必填字段,因此第二个元素无效,无法创建员工。

对此有什么好的回应? 201或422?

我看到207,但似乎需要XML响应,而API不使用XML。仅针对这种情况返回XML似乎很奇怪。

对于这个特定用例,我认为所有有效元素都将用于创建资源。但我不确定会有什么好的回应。

4 个答案:

答案 0 :(得分:1)

我们使用400来表示任何字段验证错误(包括缺少必填字段),无论是在单个资源上还是整个集合中。

答案 1 :(得分:1)

我不完全确定你想做什么。

  • 仅处理有效负载中的有效部分。
  • 根本不处理有效载荷。

为了使事情发生,整个有效载荷应该是有效的,而不仅仅是它的一部分。所以我不会只处理有效载荷的有效部分。

我不会使用任何2xx状态,因为这会告诉用户一切正常,但在这种情况下并非如此。

我不会返回400状态,因为有效负载的语法在语法上是正确的JSON,但在语义上是错误的。

这会让我们处于422状态,这在这种情况下更合适,因为正如我之前所说,你有语义而不是句法问题。

答案 2 :(得分:0)

一种方法是拥有批处理程序。因此,您将在单个HTTP请求中发送一批操作,但它们将作为针对服务器上的api的单独操作进行处理。因此,批处理响应将包括每个单独操作的相应响应代码。

批处理请求还可以包括用于定义事务行为的更改集。

您的批次还可以根据需要包括对不同操作的调用。

你没有说明你是如何建立你的api的。如果使用ASP.NET Web API,则可以使用开箱即用的批处理功能。

答案 3 :(得分:0)

我坚持使用@visc建议,即避免批量处理。我不得不说@Alexandru Guzinschi尽管是合理的但仍然建议全部或全部的方法并不总是可行的,因为有时你会在尝试之后意识到一个操作失败。

您提到的两个代码207和422都被定义为WebDAV的HTTP扩展,而不是协议本身。而且它的RFC(4918)已经过时了(这就是为什么207响应机构的XML建议)。

无论如何,如果你想走这条路,我想澄清XML的使用是可选的,你可以创建自己的JSON定义。如果您不尝试实施WebDAV服务器,那将是无害的,

RFC 4918

"多状态响应传达有关多个资源的信息    在多个状态代码可能适合的情况下。该    默认多状态响应正文是text / xml或application / xml    具有'多状态的HTTP实体'根元素