使用RESTful架构访问多维数据

时间:2010-08-18 22:58:02

标签: rest opensearch

我们应该如何使用REST以有效的方式访问多维数据?选择似乎是hi-REST,lo-REST或OpenSearch(这似乎是lo-REST的专业化)。

2 个答案:

答案 0 :(得分:2)

为了使您的系统成为RESTful,其中一个要求是客户端不知道您的URI结构如何。这意味着您不能像大多数Twitter客户端那样编写以特定方式构建URI的代码。传统观点认为,为了找到资源,您需要在不同的地方发现它的URI。

然而,有时您在系统中处理了无数的资源,并且提供每个资源的链接只是简单的愚蠢。多维数据适合此类别。在这些情况下,只要在运行时发现这些规则,为客户端提供URI构造规则就完全有效。

OpenSearch绝对是解决这个问题的RESTful解决方案,而且程序员对此非常友好。 OpenSearch的很多用途仅限于简单的人类可读HTML搜索结果,但实际上它也可以用于纯机器可读(例如原子)搜索结果:

<Url type="application/atom+xml"
     template="...search/?q={searchTerms}"/>

此模板指示客户如果您想要原子表示,可以到此处。但这如何适合多维数据呢? OpenSearch的可扩展性在这里发挥作用。 OpenSearch time extension描述了如何指示客户端构造表示受限于特定时间范围的搜索的URL(假设xmlns:time绑定正确:

<Url type="application/atom+xml"
     template="...search/?after={time:start}&amp;before={time:end}"/>

如果客户端看到此模板,它可以从模板中看到它只允许时间约束。让我们自己来扩展它。

为了扩展OpenSearch,我必须指定一个名称空间和该名称空间中的一些元素来表示特定的东西。这应该在某个地方发布,以便其他人可以访问文档并实现自己的服务器和客户端。假设您希望按姓氏查看客户;姓氏是一个非常通用的术语,但不够通用,以至于它已被标准化。假设我定义了一个名称空间,将其绑定到我的OpenSearch描述中的name前缀,并公开以下模板:

<Url type="application/atom+xml"
     template="...search?lastName={name:last}"/>

此模板通过填写模板,指示任何了解我的name命名空间的客户端可以进行姓氏查找。

这仍然不是多维的,但让我们添加另一个维度;地理。幸运的是,有OpenSearch draft extension for geography允许在边界框或圆圈内搜索:

<Url type="application/atom+xml"
     template="...search/?latitude={geo:lat?}&amp;
                          longitude={geo:lon?}&amp;
                          metres={geo:radius?}"/>

我正在拆分模板以使其可读。

模板仍然不是多维的,因为它只允许在一个维度内搜索(geospacial)。那么你如何进行多维搜索?您提供了一个模板,该模板显示了如何进行多维搜索,这有点合并:

E.g。这是一个模板,允许我在不同的区域(二维)找到具有给定姓氏的人:

<Url type="application/atom+xml"
     template="combo-find?customerLastName={name:last}&amp;
                          lat={geo:lat?}&amp;
                          lon={geo:lon?}&amp;
                          radius={geo:radius?}"/>

这是一个允许我限制名称和地理空间以及时间限制的模板(尽管OpenSearch Time扩展没有说明您要查找的时间):

<Url type="application/atom+xml"
     template="...search/?lastName={name:last}&amp;
                          lat={geo:lat?}&amp;
                          lon={geo:lon?}&amp;
                          r={geo:radius?}&amp;
                          after={time:start}&amp;
                          before={time:end}"/>

在这些示例中,客户端可以自由查看URI模板,以确定要填写的URI模板参数。因此,客户端将知道每个URI模板支持的维度,并且可以在任何时候确定哪个URI最适合。

所有这些的RESTfulness是因为所有REST约束都得到了尊重;它是无状态的,超媒体是引擎,它是分层的,等等.OpenSearch只是另一种超媒体格式,非常好的格式!

答案 1 :(得分:0)

基于我在Google上搜索hi-REST和lo_REST这两个术语,我认为这两种选择都不会对效率产生太大影响。相反,它更像是how "correct" you want to be.

的问题

Hi-REST可以说更“正确”,但我怀疑使用Hi-REST会对效率产生任何重大影响。您选择传输数据的数据表示(即XML,二进制XML,JSON等)将对数据性能产生更大的影响。