2

我正在寻找一种独特的方式来以 REST 方式查询以下用例:-

假设存储库包含以下内容:-

a. green color ball image of 1cm radius
b. yellow color ball image of 1cm radius
c. blue color ball image of 1cm radius
d. green color ball image of 2cm radius
e. yellow color ball image of 2cm radius
f. blue color ball image of 2cm radius
g. computer monitor icon image of size 32x32 pixels in png format
h. computer monitor icon image of size 64x64 pixels in png format
i. computer monitor icon image of size 32x32 pixels in ico format
j. computer monitor icon image of size 64x64 pixels in ico format
k. HR travel policy
l. HR new hire policy
g. HR promotion policy

1. Find all documents published after a certain date?
2. Find all documents published before a certain date?
3. Find all documents published between a certain set of dates?
4. Find all balls which are 1cm in radius
5. Find all documents whose download format is "png"
6. Find all documents whose size is 32x32 pixels
7. Find all balls which are green in color.

我们的存储库可以基于 Google Storage、Amazon S3、Mongodb GridFS、Java 内容存储库 (JCR 2.0) 或简单的文件系统。

存储和检索上述数据的理想方式是什么。我希望 REST URL 尽可能具有表现力,以便我可以对上述任何用例 [1-6] 进行建模。感谢有关如何设计通用存储库的任何指示,以便我可以使用适当的命名约定来根据上述查询获取文档。

4

1 回答 1

2

我建议在这里分离两个问题:1)建模存储库;2) 设计 RESTful 访问。当开发刚刚开始时,这两个问题总是齐头并进的。随着项目的发展,您可能需要为存储库设计聚合点或简单的不同观点。了解这些概念仅在表面上相似总是很好。

就您的 7 个问题而言,首先您需要确定“文档”的概念是否可以完全替换为“文档实例”的概念。例如,如果一个红球的 ID 为 1,那么以下两个资源是否有效?

/documents/1
/balls/1

您可以向以下两个资源或仅一个资源发布一个新球吗?

/documents/
/balls/

你能通过一个或多个资源找到所有的绿球吗?

/documents/type/ball/by/color/green
/balls/by/color/green

回答这些问题很重要,这样您的 API 才会明确。

其次,您需要确定您希望资源看起来如何“对 SEO 友好”。例如:

1. /documents/after-date/2001-01-01/
2. /documents/before-date/2010-12-31/
3. /documents/after-date/2001-01-01/before-date/2010-12-31/
7. /balls/by/color/green

or

1. /documents?after-date=2001-01-01
2. /documents?before-date=2010-12-31
3. /documents?after-date=2001-01-01&before-date=2010-12-31
7. /balls?color=green

如果您的 API 是完全开放的并且用于驱动公共网站上的链接,这是一个“问题”。我之所以将“SEO 友好”和“关注”放在引号中,是因为 SEO 专家仍然不同意搜索引擎是否更喜欢一种方式或引擎根本不关心。

从实现的角度来看,使用 URL 参数更容易、更快且更具可扩展性。但是,如果您不期望有大量的组合,那么这两种方法都将同样有效。

从个人经验来看,我还建议将搜索类型的资源(与身份资源相反)与一个共同的路径分组。例如:

7. /balls/search?color=green

instead of 

7. /balls?color=green

祝设计好运。谈到 REST,没有一种正确的方法。只要它有意义——你就走在了一条好路上。

于 2011-02-04T03:09:25.140 回答