rest - 测试数据库中是否存在电子邮件地址后,正确的状态代码是什么?
问题描述
我们在我们的 API 上使用一个特定的端点来测试一个电子邮件地址是否已经在我们的数据库中注册。如果不是,返回给客户端的正确状态代码是什么?
我们不能在 404、204 和 200 之间做出决定。网上有几篇文章,但都说明了优缺点,但不是很清楚。
解决方案
- 200 表示请求成功
- 204 表示请求成功并且响应中包含的消息正文长度为 0 字节。
- 404 表示当前没有与请求的资源相关联的实现
其中哪一个是正确的实际上取决于您的资源设计。
考虑一个带有 where 子句的数据库查询——如果没有匹配的行,那么您将获得 SUCCESS,但结果集为空。因此,HTTP 响应中的类似内容是 2xx 状态码和描述空集的主体。
如果您使用 JSON 列表作为集合的表示,那么表示将是两个字节长[]
,并且200
状态代码将是合适的。如果您使用json 行表示,每条记录在其自己的行上,那么没有记录您将没有行,因此 0 字节表示,204
这将是一个不错的选择。
如果我们有一个简单的网页,它会告诉您电子邮件地址是否已注册,那又如何呢?如果它已注册,服务器会响应一条200
消息和一个 html 文档,告诉您有关注册的信息。如果它未注册,那么您会收到一条 html 消息,告诉您该电子邮件地址未注册...和一个200
,因为我们能够找到资源的当前表示。
还有404?404 向客户端表明在 http 请求的目标 uri 中似乎存在拼写错误——甚至找不到任何东西。
理解状态码是关于 HTTP 响应的元数据可能会有所帮助,也就是说它们是通过网络传输文档的应用程序域的一部分,而不是关于业务域。它们在那里,以便通用组件(如缓存)可以做有趣的事情,而无需了解有关域的任何细节。
我们的 Web API 是一个外观,使我们的域模型看起来像一个无聊的文档存储。
推荐阅读
- proxysql - Proxysql - 请帮我澄清“规则链”功能
- master-pages - button_Click 事件从未命中
- xcode10 - 将手机更新到 12.2,现在 xcode 10 在构建应用程序时抛出错误
- amazon-s3 - 如何访问我从其他人那里获得的 s3 链接
- microsoft-graph-api - Microsoft Contoso Airlines Team 示例中的 Authorization_IdentityNotFound 错误
- php - 这是从数据库中获取数据的有效方法吗?
- python-3.x - 我将如何检查持有的密钥?
- amazon-quicksight - 无法将 Quicksight 仪表板用作 S3/cloudfront 白名单域上的嵌入 URL
- java - 为什么这段代码编译失败,原因是类型推断?
- batch-file - 使用 CURL 从批处理文件中下载