获取所有资源的“正确”REST URL是什么?

11
所以......我知道这个问题可能非常接近于“基于观点的”(opinion based)。我希望它不是,并且REST标准清楚说明了我要问什么,但如果不是,我将关闭它。
我的网站(使用Django开发,数据存储在Postgres中)有Product和Category。每个Category可以包含多个Product。
因此,问题是:如果有的话,获取所有分类及其每个分类下的所有产品的“正确”端点是什么?
我认为,获取特定类别的所有产品应该是很清楚的。例如,如果类别ID是24,则获取其所有产品的方式如下:
http://myserver.com/api/categories/24/products
那么获取所有分类及其每个分类下的所有产品应该怎么办?
是这样吗?
http://myserver.com/api/categories/products
还是这样?
http://myserver.com/api/categories/all/products
还是最好使用某种参数,比如:
http://myserver.com/api/categories?mode=all_products
想法是获得这样的响应(JSON格式):
{
    "25": [{
        "id": 1,
        "name": "Product 1 in category 25",
        "price": 100
    }, {
        "id": 2,
        "name": "Product 2 in category 25",
        "price": 200
    }],
    "26": [{
        "id": 3,
        "name": "Product 1 in category 26",
        "price": 300
    }, {
        "id": 4,
        "name": "Product 2 in category 26",
        "price": 400
    }]
}

谢谢您的提前帮助。


1
这可能只是 http://myserver.com/api/products。由于 URL 的含义是可用产品的完整集合,并且不考虑结果的格式,包括类别。例如:http://www.restapitutorial.com/lessons/restfulresourcenaming.html - 4xy
感谢您的评论,@4xy :-) 针对该特定URL的问题是,我已经使用它获取了所有产品的列表,而不管它们是否按类别排序。 - Savir
“REST标准”?REST只是一种架构风格,而不是标准!接下来,REST并不太关心你的URI设计,只要你尊重后台协议(在你的情况下是HTTP),并且URI是它们所声称的唯一即可。像http://someserver.com/foo/bar/adjfajdöaj/sajdkaj这样的东西与您提供的URI之一一样具有RESTful特性(好坏取决于个人观点)。 - Roman Vottner
1个回答

8

就REST而言,如果您在url中唯一表示资源,使其可缓存(并遵守HATEOAS,但我们跳过此部分),则如何构造url并不重要。有了这个前提,我认为,由于您想获取所有产品,所以您的url应该类似于

GET /products         # to return all products with their associated categories
GET /category/24/products  # to return all products belonging to a particular category

注意:尽管URL结构并不是REST的一部分,但按照实体/资源和标识符设计URL确实更容易创建RESTful API。良好结构化的URL也使客户端更容易使用。

虽然对于人类来说,良好结构化的URI可能更容易解释,但并非所有客户端都能够这样做。有人可能会认为,为资源指定一个含义丰富的命名方案可能会干扰Roy Fielding所提出的规则(http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven),因为这可能会导致实现者依赖这些路径,从而将其客户端与API紧密耦合,而不是使用响应中找到的URI和关系。 - Roman Vottner
我是指这会让开发与API交互的客户端的开发人员更容易。其次,如果有人要硬编码URL,URL可读或不可读并不重要。遵循惯例和“最小意外原则”是没有错的。 - hspandher
1
是的,这就是我一直在寻找的...一个“明智”的URL架构...我知道它们只是URL,因此,我可以使用任何我想要的方式...我只是想听听如何制作“合理”的URL的建议。谢谢 :) - Savir
第二个例子应该是 /categories/{categoryId}/products,因为你首先通过分类筛选,然后返回其产品。 - Arsen Khachaturyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接