rest - 更正 REST API 语义以检查电子邮件是否存在
问题描述
我有一个看起来像GET user/exists/by?email=<email_here>
. API 的目标是检查电子邮件是否存在。
我对 API 的正确语义应该是什么感到困惑?目前,我有两个选择。
选项 1:使用 HTTP 状态代码来驱动 API。
204
如果电子邮件存在则发送404
如果电子邮件不存在则发送400
如果电子邮件验证失败,则发送
选项 2:
- 存在电子邮件时
200
使用正文发送{"exists": true}
- 电子邮件不存在时
200
与正文一起发送{"exists": false}
400
如果电子邮件验证失败,则发送
解决方案
- 如果电子邮件存在,则发送 204
- 如果电子邮件不存在,则发送 404
我认为您不会为您的问题找到权威的答案。
也就是说,我鼓励你做的一件事是查看服务器发送的 HTTP 响应,特别注意发送的元数据的字节数;状态行、标题等。
然后仔细考虑小型 JSON 有效负载和零长度有效负载之间的差异是否如此重要。
此外,回想一下,如果客户端不希望返回表示的副本,则客户端可以使用方法令牌HEAD
而不是GET
请求资源元数据的刷新副本。
200 对 404 更难。200 表示有效负载是所请求资源的表示(默认情况下可缓存)。404 表示有效负载是错误消息的表示(默认情况下可缓存)。
HTTP 状态代码是有关通过网络域传输文档的元数据。因此,使用它来处理文档中的细粒度区别确实是错误的机制。
例如,查看缓存失效规范,请注意处理 2xx 和 4xx 对不安全请求的响应的区别。
原则上,HTTP 数据属于标头,您的数据属于正文,只有当您的数据对通用 HTTP 组件感兴趣时,我们才应该将您的数据副本提升到 HTTP 元数据。
但是,据我所知,并不权威。这都是非常随意的,不容易与特定的 RFC 或咨询相匹配。
推荐阅读
- c++ - Visual Studio 代码 SFML 没有这样的文件或目录
- ruby-on-rails - 导轨中的 belongs_to 和 has_many
- javascript - 递归地用另一个对象过滤一个对象
- c# - ASP.Net Core 3.1:控制器方法总是从 HttpPost 调用中接收 NULL 参数
- python - 如何在 matplotlib 中绘制二维结构化网格
- elasticsearch - 按术语分组并获取嵌套数组属性的计数?
- android - Android Q,如何使用正确的文件名使用 MediaStore 保存录音?
- video - 视频标签中 WebP 海报的后备,如何?
- parquet - 是否可以将多个 oracle 数据库表写入一个 parquet 文件?
- while-loop - 使用 LCD Arduino 计算值并执行计算