在RESTful API中检查资源存在的正确路由



设计API端点以检查资源的存在性的最佳/restful方法是什么?

例如,有一个用户数据库。当新用户尝试注册时,我想检查一下电子邮件是否被使用过。

我的想法是:POST /user/exists和有效载荷应该类似于{"email": "foo@bar.com"}。响应将是200 OK或409 Conflict。

这是正确的方式吗?

谢谢!

HEAD是最有效的存在性检查:

HEAD /users/{username}

请求用户的路径,如果存在200,则返回404

请注意,您可能不想暴露检查电子邮件地址的端点。它打开了一个安全和隐私漏洞。已经在网站周围公开显示的用户名,比如在reddit上,可能还可以

GET /users?email=foo@bar.com

这是一个基本的搜索查询:为我找到指定了电子邮件地址的用户。如果不存在用户,则使用空集合进行响应,或者使用符合条件的用户进行响应。

我认为检查是否存在的正确方法是对GET请求通常获得的任何资源使用HEAD谓词。

我最近遇到一个情况,我想检查服务器上是否存在一个潜在的大型视频文件。我不希望服务器尝试开始将字节流式传输到任何客户端,所以我实现了一个HEAD响应,该响应只返回客户端在对该视频进行GET请求时将接收到的标头。

您可以在这里查看W3规范,或者阅读这篇关于HEAD动词实际使用的博客文章。

我认为这太棒了,因为你不必考虑如何形成与普通RESTful路由不同的路由来检查任何资源的存在,无论是文件还是典型的资源,比如用户或其他什么。

我更喜欢:

HEAD /users/email/foo@bar.com

说明:您正试图通过所有用户找到正在使用电子邮件foo@bar.com的用户。我在这里假设电子邮件是而不是您的资源的密钥,您希望在端点上有一些灵活性,因为如果您需要另一个端点来检查用户的另一个信息(如用户名、号码等)的可用性,这种方法非常适合:

HEAD /users/email/foo@bar.com
HEAD /users/username/foobar
HEAD /users/number/56534324

作为响应,您只需要返回200(存在,因此不可用)或404(不存在,因此可用)作为http代码响应。

您也可以使用:

HEAD /emails/foo@bar.com

如果HEAD /users/email/foo@bar.com与现有的rest资源冲突,比如具有不同业务规则的GET /users/email/foo@bar.com。如Mozilla文档中所述:

HEAD方法请求与GET请求相同的响应,但没有响应主体。*.

因此,使用不同规则的GETHEAD是不好的。

如果电子邮件是"CCD_ 18",则CCD_;键";因为您(可能)有一个GET /users/foo@bar.com

最新更新