考虑调用REST API:
POST /employees
[{ "name":"joe", "job":"dev",
{ "name":"bob" }]
对于每个数组元素,将创建一个员工。但是,job是必填字段,因此第二个元素无效,无法创建员工。
对此有什么好的回应? 201或422?
我看到207,但似乎需要XML响应,而API不使用XML。仅针对这种情况返回XML似乎很奇怪。
对于这个特定用例,我认为所有有效元素都将用于创建资源。但我不确定会有什么好的回应。
答案 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服务器,那将是无害的,
"多状态响应传达有关多个资源的信息 在多个状态代码可能适合的情况下。该 默认多状态响应正文是text / xml或application / xml 具有'多状态的HTTP实体'根元素