这是困难的。
我认为我们应该;
仅当客户端有权更改请求、标头或正文时才返回 4xx 错误,这将导致请求以相同的意图成功。
当预期的突变没有发生时返回错误范围代码,即 DELETE 没有发生或 PUT 没有改变任何东西。但是,POST 更有趣,因为规范说它应该用于在新位置创建资源,或者只处理有效负载。
使用 Vish 回答中的示例,如果请求打算将员工 Priya 添加到部门 Marketing 但未找到 Priya 或她的帐户已存档,那么这是一个应用程序错误。
该请求运行良好,它符合您的应用程序规则,客户端正确执行所有操作,ETags 匹配等等等。
因为我们使用的是 HTTP,所以我们必须根据请求对资源状态的影响做出响应。这取决于您的 API 设计。
也许你设计了这个。
PUT { updated members list } /marketing/members
返回成功代码将表明资源的“替换”有效;对资源的 GET 将反映您的更改,但不会。
所以现在你必须选择一个合适的否定 HTTP 代码,这是棘手的部分,因为这些代码主要用于 HTTP 协议,而不是你的应用程序。
当我阅读官方的 HTTP 代码时,这两个看起来很合适。
409(冲突)状态码表示由于与目标资源的当前状态冲突,请求无法完成。此代码用于用户可能能够解决冲突并重新提交请求的情况。服务器应该生成一个有效载荷,其中包含足够的信息供用户识别冲突的来源。
和
500(内部服务器错误)状态代码表示服务器遇到了阻止它完成请求的意外情况。
尽管我们传统上认为 500 就像一个未处理的异常:-/
我不认为发明自己的状态码是不合理的,只要它始终如一地应用和设计。
这种设计更容易处理。
PUT { membership add command } /accounts/groups/memberships/instructions/1739119
然后,您可以设计您的 API 以始终成功创建指令,它返回201 Created和Location标头,指令的任何问题都保留在该新资源中。
POST 更像是最后一次 PUT 到新位置。POST 允许对消息进行任何类型的服务器处理,这会打开类似“操作成功失败”之类的设计。
可能您已经编写了一个执行此操作的 API,即网站。您发布了付款表格,但由于信用卡号码错误,它被成功拒绝。
对于 POST,是否返回 200 或 201 以及拒绝消息取决于是否创建了新资源并且是否可以在其他位置获取 GET。
综上所述,我倾向于设计需要更少 PUT 的 API,也许只是更新数据字段,以及调用规则和处理的操作和内容,或者只是有更高的预期失败机会,可以设计为 POST 指令形式。