【问题标题】:How to design api to retrieve one resource by non-primary key in RESTful style?如何设计api以RESTful风格通过非主键检索一个资源?
【发布时间】:2017-01-26 23:21:06
【问题描述】:

原来,我们有一个 api GET /users/:id 可以通过其主键检索 user

现在我们需要一个新的 api 来通过其电子邮件检索 user

GET /users?email=xx@xx.com好像要收藏了。

GET /users/byEmail/:email 包含一个非名词词byEmail

还有其他选择吗?

【问题讨论】:

标签: rest


【解决方案1】:

您建议的两种方法本身都是有效的,但我可能不会同时使用这两种方法,因为最好每个资源都使用 一个 URI。另一种常见的方法是:

/users/id/:id

/users/email/:email

我应该指出,查询参数与 url 参数或 /name/:value/:value 的选择并不是使服务“RESTful”的原因。换句话说,拥有“漂亮”或“可读”的 URL 并不自动意味着您的服务是 RESTful。

REST 的一个关键点是通过 URI 进行资源识别,即特定的 URI 将始终指向特定的资源。在电子邮件的情况下,这可能会发生变化(用户可能想要更改他们的电子邮件地址),因此此 url 不再始终识别此用户。

更 RESTful 的方法是明确表明这确实是一个 搜索 而不是 标识符,并且具有这样的 URI:

/search/users/email/:email

这更加 RESTful,因为此 URI 始终标识相同的资源,即此电子邮件地址的搜索结果。请注意,本例中的资源是搜索结果,而不是用户资源本身。

【讨论】:

    【解决方案2】:

    我喜欢在路径末尾带有/ 的URI 是集合的约定。所以GET /users?email=xx@xx.com 返回一个项目,GET /users/?email=xx@xx.com 返回一个包含单个项目的集合。但是ofc。您不必使用此约定。

    如果您可以解决服务器上的路由,另一个选项是使用/users/:email,或者/users-by-email/:email/users/email-:email等...只要您的REST API满足,您选择哪种URI结构并不重要HATEOAS constraint

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多