2016-04-13 37 views
0

我有一个无法更新的资源(事件)。因此,我只允许发布&获取操作。 (我没有选择PUT,因为eventId是在服务器端生成的,并作为响应的一部分返回)。无法更新的资源的REST响应代码

我已经在输入中有三个字段的组合,可用于识别唯一资源。

鉴于此,如果有人张贴相同的请求两次,这就是我期待返回

  • 案例1:如果独特的领域已经存在于数据库,完整的要求是 正是因为前一个相同,则我们忽略这个请求(因为 资源已经存在)。
  • 情况2:如果DB中已存在唯一字段但其他部分 请求不同,则发送错误响应说不支持 。

什么应该是正确响应代码在这两种情况下,1 &情况下返回2

感谢, 哈里什

回答

1

如果调用是幂等的,意味着情况1,我期望它返回一个200 OK因为它没有真正失败,这与在执行PUT时使用相同的值更新相同。

如果该呼叫不是幂等的,意味着情况2,那么即使用户不应该实际重试该呼叫,我也会期望一个409冲突。这是因为通过你所说的,实际上允许用户发送具有相同标识符的请求,只要所有其他参数也是相同的。

另外,这只是我的直觉,如果用户尝试了不同的参数来查看不同类型的响应代码,他可以确定资源的当前状态,即使可能他不被允许读取它。因此,根据您的应用程序的范围,您可能想要回复相同的响应。

+0

一样,如果该用户不被允许阅读,我喜欢你的可能的安全漏洞。尽管这不是我目前的用例。对于案例2,如何使用422? – Harish

+0

响应422特别针对像语义错误这样的情况,在你的情况下,它也不是真的,因为如果第二个请求是第一个请求,它的语义也是正确的。第二个请求没有指定超出范围的参数或类似的东西,所以我会说这不是422. – ChatterOne

+0

谢谢。当然有意义的是,如果第二个请求是第一个请求的话,那么它就不可能在语法上成为正确的语法。感谢您的澄清。情况1和情况2将使用200。 – Harish

1

编辑:

因为无论是409还是400适合你的情况下,或许422 Unprocessable Entity

http://www.restpatterns.org/HTTP_Status_Codes/422_-_Unprocessable_Entity


也许409冲突是你在找什么。

https://httpstatuses.com/409

如果你想发信号给客户端,失败是“最终”,不要求编辑将改变这种状况,另一种选择是400错误的请求

就个人而言,我只在请求语法非法时才使用400 - 这里不是这种情况。

+0

我看到了..但409说,用户可以在更正后重新提交请求。但在我的情况下,它只是不受支持,用户不应该重试,因为资源已经存在,我们不支持更新。因此,我不能使用409 – Harish

+0

然后可能会考虑400个,因为很多/大多数人会认为使用它不合适。 – morsor

+1

或422无法处理的实体 – morsor