资源创建POST由于现有匹配资源而失败时的HTTP响应代码

时间:2014-08-28 05:17:52

标签: api rest http post http-status-codes

想象一下,我们有一个API,可以通过POST来创建新的员工

www.example.com/api/employees

员工可以被描述为,

{
  name: "John Smith",
  tax_number: "ABC123"
}

税号对所有人来说都是独一无二的。如果创建了一个创建,并且已经存在一个名称和税号与现有记录匹配的记录,则可以安全地假设请求者想要返回该记录的引用(使用它的内部id和其他数据,客户端可能不会有,例如,创建于,更新于)。

返回该资源的HTTP状态代码是什么?我想重定向可以用于返回id,但我更喜欢将整个对象包含在响应中。

这种情况对于简单的重复错误是唯一的,因为如果尝试重复,则意味着您希望创建的记录已经存在 - 而不是与现有记录冲突。

2 个答案:

答案 0 :(得分:19)

我认为如果您将资源发布到API,您希望代码201将声明资源已创建,并且正文将(可以)包含该资源。 否则,您首先必须检查资源是否已创建,但这需要两次调用。

否则,您的状态代码为409:

  

由于与资源的当前状态发生冲突,无法完成请求。

[编辑]阅读amundsen,Ruby和Richardson的Restfull Web Apis后

最好是使用409状态代码,该代码表明与服务器上存在的资源存在冲突。把那个"冲突的网址"响应的位置标头中的资源,并在正文中添加冲突消息

答案 1 :(得分:2)

有一个409 Conflict响应代码,通常用于让客户端知道服务器上已存在此类实体。解析错误响应的正文可能不是很直观,但如果在API文档中指定了这一点,则应该没有问题(将有关原始条目的信息放在响应正文中)。