2008-12-19 110 views
6

从REST服务中检索复杂查询的最佳方式是什么?什么是创建RESTful复杂查询的最佳方式?

假设我想获得X个集合,对每个集合应用过滤器和等式,使用其他操作合并集合并返回一个结果,所有内容都在一个请求中。

因为我可以结合超过300个集合(加上运算符和过滤器到每个集合),所以将所有内容都放在查询字符串中太复杂(并且很大)。

我想过使用POST发送描述查询到像一个XML对象:

http://mydomain/collections/complexQuery 

它会返回一个唯一的ID,然后我可以使用GET检索complexQuery结果:

http://mydomain/collections/complexQuery/{queryId} 

杰森S:

这就是这个想法。 POST将采用查询的XML表示形式,其中已有“where”参数(它们可能太多)。查询将仅在GET到达时执行。我可以让查询对象在一段时间内可用并在以后删除它。

这是一个很好的解决方案吗?我仍然这么做RESTful吗?

回答

2

如果您使用的是唯一ID,那么对我来说听起来很RESTful。如果查询结果集很大,则可能需要包含一种询问结果集行M-N的方式,其中M,N是参数。

我想你的唯一ID方法(w /查询定义状态存储在服务器上)的优点是你可以使用查询的结果作为另一个查询的参数。甚至可能会分离出查询执行过程中的查询定义。

2

这是标准的RESTful方法。 POST添加到资源,并期望201 Created(无实体正文)的URI与Location标题中创建的结果的URI。您还可以使用200 OK响应返回结果,还可以选择指向响应中未来(德)参考结果的URI以及结果副本。

1

这是可以的。但是它引入了一些问题:

  1. 您必须在服务器上保留查询数据,何时清理旧查询?
  2. 如果您清理旧查询,这意味着您无法提供已保存查询的链接,因为它们可能已被清除。

  3. 即使是简单的查询需要两个往返(POST &然后GET)

  4. 你的客户端需要熟悉你所期望的XML架构,而不是众所周知的: param1=val1&param2=val2
1

对不起,我的无知...

但为什么不只是返回数据的帖子?

我可以理解为什么这是错用GET来更新数据,但我不明白为什么它应该是强制性的,以更新每一个岗位的数据?

我也明白,这个想法是每个get方法都可能被缓存(因为它们不会修改数据),但在这种情况下,只有在临时保存的查询仍处于活动状态时才能缓存它们。增加了另一层复杂性......

我还以为休息的原则之一是定义无状态(如HTTP协议)接口,在这种情况下,服务器正在维护的状态,解决了查询..

我刚刚开始阅读有关休息和有几个东西,我只是还不明白...

相关问题