首页 > 解决方案 > 测试数据库中是否存在电子邮件地址后,正确的状态代码是什么?

问题描述

我们在我们的 API 上使用一个特定的端点来测试一个电子邮件地址是否已经在我们的数据库中注册。如果不是,返回给客户端的正确状态代码是什么?

我们不能在 404、204 和 200 之间做出决定。网上有几篇文章,但都说明了优缺点,但不是很清楚。

标签: resthttphttp-status-code-404api-designhttp-status-codes

解决方案


  • 200 表示请求成功
  • 204 表示请求成功并且响应中包含的消息正文长度为 0 字节。
  • 404 表示当前没有与请求的资源相关联的实现

其中哪一个是正确的实际上取决于您的资源设计。

考虑一个带有 where 子句的数据库查询——如果没有匹配的行,那么您将获得 SUCCESS,但结果集为空。因此,HTTP 响应中的类似内容是 2xx 状态码和描述空集的主体。

如果您使用 JSON 列表作为集合的表示,那么表示将是两个字节长[],并且200状态代码将是合适的。如果您使用json 行表示,每条记录在其自己的行上,那么没有记录您将没有行,因此 0 字节表示,204这将是一个不错的选择。

如果我们有一个简单的网页,它会告诉您电子邮件地址是否已注册,那又如何呢?如果它已注册,服务器会响应一条200消息和一个 html 文档,告诉您有关注册的信息。如果它未注册,那么您会收到一条 html 消息,告诉您该电子邮件地址未注册...和一个200,因为我们能够找到资源的当前表示。

还有404?404 向客户端表明在 http 请求的目标 uri 中似乎存在拼写错误——甚至找不到任何东西。

理解状态码是关于 HTTP 响应的元数据可能会有所帮助,也就是说它们是通过网络传输文档的应用程序域的一部分,而不是关于业务域。它们在那里,以便通用组件(如缓存)可以做有趣的事情,而无需了解有关域的任何细节。

我们的 Web API 是一个外观,使我们的域模型看起来像一个无聊的文档存储。


推荐阅读