RESTful 服务命名:获取产品列表的详细信息

RESTful services naming: GET the details of a list of products

我试图了解哪种应该是正确的 REST 方法来命名一些电子商务风格的端点。

如果我没记错的话,获取产品列表和每个产品的详细信息将以两个 GET 端点结束,如

A) GET /products

B) GET /products/id

(我故意跳过分页问题)

如果我正在查看销售特定产品的商店列表,我可以这样指定和端点

C) GET /products/id/shops

我很难理解如果我需要为商店研究指定不止一种产品会发生什么。

能否将上述端点扩展为采用多个参数,或者这在某种程度上是不鼓励的? 换句话说,我是否应该研究

1) GET /products/id1,id2,id3/shops
2) GET /products/id1/shops [id2,id3]

或者更确切地说是一个全新的

3) GET /shops [id1,id2,id3]

?

备注

  1. Unanswered question in SO 似乎强调这是 RESTful 服务中的一个不为人知的故事……:)
  2. My current source of reference
  3. 正如许多 SO 答案中所提到的,例如 here,URI 不会使服务成为 RESTful。

    我同意,所以为了扩展这个概念,我上面的观点是,上面 1) 之类的服务的 实现 可能是(在我的例子中是, 对于服务器实现细节)不同于以 C) 的形式轻松组合 3 个端点给出的结果。

    从更一般的意义上讲,这种组合的实现可以保留在内部。

    因此,是的,URI 不会提供服务 RESTful,但如果能为多个 id 扩展 C) 表单的清晰度和表现力就好了。

编辑 回应Lutz在answer中的正确注解,shops可以单独作为resources处理。 如果,我想出了这个不太聪明的例子,子资源本身并不真正 存在 ,例如电影院中 2 部电影的免费位置

GET /movies/12,14/places

其中

GET /places?movies=12,14

显然可行,但 RESTful 恕我直言。

我会将 shops 设为单独的资源。

  • GET /shops 列出所有商店
  • GET /shops/123获取店铺详情123
  • GET /shops?sellsProduct=id1,id2,id3 列出所有销售该产品的店铺

在像 /products/id/shops 这样的 URL 中,商店是产品的子资源。但既然店铺可以独立于任何产品而存在,这就没有多大意义了。

我同意Lutz Horn 给出的答案。此外,我不确定为什么您会认为在 GET 请求中使用查询字符串是 "not that RESTful".

引用 O'Reilly's RESTful Web Services,第 233 页,在 header URI 设计 下(强调我的):

Use punctuation characters to separate multiple pieces of data at the same level of hierarchy. Use commas when the order of the items matters, as it does in latitude and longitude: /Earth/37.0,-95.2. Use semicolons when the order doesn't matter: /color-blends/red;blue.

Use query variables only to suggest arguments being plugged into an algorithm, or when the other two techniques fail. If two URIs differ only in their query variables, it implies that they're the different sets of inputs into the same underlying algorithm.

这应该会给您足够的指导来确定如何构建您的路线。虽然你可以很容易地构造它(使用分号,因为这里的顺序似乎并不重要):

GET /products/id1;id2;id3/shops

你可以这样写:

GET /shops?productIds=id1,id2,id3

这可能是一种更合理的方法,因为您表示您正在做的是搜索所有销售特定商品的商店,而搜索是一种以产品 ID 作为输入参数的算法。

对于你的电影示例(如果我理解正确的话),如果你正在寻找放映电影(或电影)并且有座位的地方(我们的资源):

GET /places?movie=id1,id2,id3&availability=true

您似乎只有额外的搜索参数。如果我误解了您的 "subresource may not exist" 评论,请为我们澄清这一点,以便我们妥善解决。