【问题标题】:REST best practice, GET a user by userId according to a cluster by clusterIdREST最佳实践,根据clusterId通过userId获取用户
【发布时间】:2017-10-12 18:05:10
【问题描述】:

我想根据集群通过 userId 获取用户。我有同一个用户,但在多个集群中,我需要通过 clusterId 查询它

以下哪个 URL 端点是最佳做法?

  1. www.example.com/user/{userId}/cluster{clusterId}
  2. www.example.com/user/{userId}?cluster={clusterId}

【问题讨论】:

  • 没有对错,只是个人喜好,所以我投给Primarily opinion-based
  • 不过,既然您在 REST 方面拥有丰富的经验,您会实施哪个选项?
  • 老实说,没关系。如果两者兼而有之,则用户和集群可以独立存在,而不是简单地选择第二个选项。如果用户只能存在于集群中,那么使用/clusters/users 会更有意义,并且如果您只想列出某个集群的用户,而不是使用/clusters/{clusterId}/users 之类的东西或任何您喜欢的东西

标签: rest spring-mvc spring-boot


【解决方案1】:

首先,在 Rest 中,您的资源必须使用复数形式,即 /users/{userId} 而不是 /user/{userId}

为了回答您的问题,我会选择第二个,它使用查询参数,它为使用一个端点的其他用例提供了更大的灵活性和重用性。

假设您想要获取所有用户,无论他们属于哪个集群,如果您使用第一个,则必须创建另一个端点,但如果您使用第二个端点,则只需使用 /users/{userId} 而不提供一个查询参数。

假设您想要获取的不仅仅是一个集群,而是多个集群的用户,您将提供一个 cluster 查询参数,其中多个 id 用逗号分隔,但是,如果您选择第一个,则必须创建另一个端点。

【讨论】:

  • you must use plural - 不!如何设置 URI 完全不重要。它只是一个指向资源的指针。 URI 的语义应该保留在关系名称中,而不是 URI 中。
  • 使用复数名词是为了保持一致。如果我们使用单数名词,端点/user 会产生一种它会返回一个用户的错觉,因为所使用的资源名称暗示了这一点,呵呵!加上/user/{id} 毫无意义。这不是我的意见,这是一个最佳实践,看看这个线程的 url,所以使用的是 /questions 而不是 questionREST principles
  • 因为 REST 不是一种协议,所以根本没有对错之分!我承认您应该使用一致的命名约定。关于 REST,尽管 URI 设计根本不重要。 RESTful 客户端根本不应该解释 URI 来决定是否调用它,而是返回 URI 的关系名称。您获得的优势只是客户端不与 API 本身耦合,而是与建议如何处理接收到的数据的媒体类型耦合。客户端只是调用包含在某个字段中的 URI,而完全忽略了 URI 字符串中可能存在的语义
  • ...因此,在真正的 REST 意义上,您在命名 URI 上付出的任何特别努力在某种程度上只是一种浪费。像 /afjafjafjaökjaöjf 这样的 URI 与 /api/users/872342 一样 RESTful。后者虽然对 API 的实现者或用户更有意义,但这也经常导致开发人员假设某些资源返回某些数据 (typed resources) 以简化实现。然而,如果服务器发生变化,客户端将中断是他们愿意忽略的另一个话题
猜你喜欢
  • 2011-10-12
  • 2011-01-19
  • 2020-03-22
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 2020-05-29
相关资源
最近更新 更多