我正在创建一个RESTful API,用于创建用户并强制唯一的电子邮件地址:
成功的POST /users
请求:HTTP 201 Created
如果我再次POST
相同的电子邮件地址,应该返回什么响应代码?409 Conflict
是否是适当的响应代码?
是的,409 是这里最适合的响应代码。即使你成功时可能会返回201,但你仍然在向被描述为集合的资源进行POST操作,并且重复的电子邮件肯定与“资源的当前状态”作为集合存在冲突。如果可能的话,你应该返回一个带有问题描述和帮助解决问题的超链接的响应体。
我认为返回409冲突
并不是一个客户端错误,因此并不是很满意。让我们看看一些大型科技公司是如何处理这种情况的(至少在他们的 WEB 网站 API 中是如何处理的)。
Gmail(Google) 返回一个200 OK
和一个 JSON 对象,其中包含指示该电子邮件已经注册的代码。
Facebook 也返回200 OK
,但重新渲染内容以显示恢复页面,使用户有选择恢复其现有帐户的选项。
Twitter 通过 AJAX 调用验证现有电子邮件。电子邮件验证资源的响应始终为200 OK
。响应包含一个 JSON 对象,其中包含一个标志,指示该电子邮件是否已经注册。
Amazon 与 Facebook 采用相同的方式。返回200 OK
并重新渲染内容到通知页面,告知用户该帐户已存在,并提供他/她进一步操作的可能性,例如登录或更改密码。
因此,所有这些 API 都始终返回200 OK
,并向客户端/用户呈现额外的内容以恢复其帐户或由响应正文引发的错误消息。
虽然被接受的答案在显示正确任务状态码方面是正确的,但我想要补充说明,您正在引入一种安全漏洞。
如果您为帐户注册返回409,则只是暴露了一个用于帐户枚举的服务。
根据应用程序,api是否公开等情况,即使未创建帐户,您可能仍希望返回201。
409 => Conflict
That mean.
注册需要一个不同于成功200代码但不是错误4xx代码的代码。
如HTTP响应代码POST资源已存在时所建议的,看看3XX:
302 Found
303 See Other
根据RFC 7231,如果处理POST的结果等同于现有资源的表示,则可以使用303 See Other。
对于现有地址暴露给枚举机器人的担忧可以通过不同的方式解决,例如验证码。
HTTP 422
,但对于现有资源(例如版本问题),使用HTTP 409
更好。 - Artegon