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

x1a*_*1a0 33 api rest restful-url

设计API端点以检查资源是否存在的最佳/宁静方式是什么?

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

我的想法是:POST /user/exists有效载荷就像是{"email": "foo@bar.com"}.响应可以是200 OK或409 Conflict.

这是一种正确的方法吗?

谢谢!

Baz*_*Baz 28

HEAD 是存在检查最有效的:

HEAD /users/{username}
Run Code Online (Sandbox Code Playgroud)

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

请注意,您可能不希望暴露检查电子邮件地址的端点.它打开了一个安全和隐私漏洞.已经公开显示在网站周围的用户名,例如reddit,可能没问题.

  • head 方法很简单,但无法返回有意义的错误消息,向客户端提供有关出错原因的附加信息(有时 4xx 5xx 错误代码是不够的) (2认同)

Pau*_*ner 6

GET /users?email=foo@bar.com
Run Code Online (Sandbox Code Playgroud)

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

  • 当然“/Users”存在,但这不是我想要获取的资源。我正在尝试 GET `/users?email=foo@bar.com` 并且该资源不存在。查询参数与路径参数一样是资源标识的一部分。 (3认同)
  • 这不是一个很好的解决方案,因为数据不应该随请求一起返回,而只是一个简单的布尔值。 (3认同)
  • 悲剧演员/达雷尔,我想说你们俩都可能是对的;这取决于OP是否将“/users?email=foo@bar.com”处的资源媒体类型定义为表示“电子邮件地址为foo@bar.com的用户”或“电子邮件地址为foo的用户集合” @bar.com”。如果是前者,那么 404 合适,如果是后者,那么 204 合适。 (2认同)

arj*_*bar 5

我认为检查存在的正确方法是使用HEAD动词来获取通常通过GET请求获得的任何资源.

我最近遇到过一种情况,我想检查服务器上是否存在可能很大的视频文件.我不希望服务器尝试开始将字节流式传输到任何客户端,因此我实现了一个HEAD响应,它只返回客户端在GET请求该视频时会收到的标头.

你可以在这里查看W3规范或阅读这篇关于HEAD动词实际用法的博文.

我认为这很棒,因为你不必考虑如何与普通的RESTful路由形成你的路由,以便检查是否存在任何资源,无论是文件还是典型资源,如用户或一些东西.