创建RESTful复杂查询的最佳方法是什么?

时间:2008-12-19 19:35:58

标签: web-services rest

从REST服务检索复杂查询的最佳方法是什么?

假设我想要获取X集合,为每个集合应用过滤器和方程式,使用其他操作组合集合并返回一个结果,一个请求中的所有内容。

将所有内容放在查询字符串中太复杂(太大),因为我可以组合300多个集合(加上每个集合的运算符和过滤器)。

我考虑使用POST将描述查询的XML对象发送到:

http://mydomain/collections/complexQuery

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

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

Jason S:

这就是主意。 POST将采用查询的XML表示,其中“where”参数已经存在(它们可能太多)。只有在GET到达时才会执行查询。我可以让查询对象可用一段时间并稍后删除它。

这是一个很好的解决方案吗?我还在RESTful吗?

4 个答案:

答案 0 :(得分:2)

这是标准的RESTful方法。对资源POST并期望201 Created(没有实体主体)在Location标头中创建结果的URI。您还可以使用200 OK响应返回结果,还可以选择一个URI,指向响应中未来(de)引用的结果以及结果副本。

答案 1 :(得分:2)

如果您使用的是唯一身份证件,我会发现RESTful。如果查询结果集很大,您可能希望包含一种询问结果集行M-N的方法,其中M,N是参数。

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

答案 2 :(得分:1)

没关系。但它引入了一些问题:

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

  3. 即使是简单的查询也需要两次往返(POST& then GET)

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

答案 3 :(得分:1)

抱歉,我的无知......

但为什么不用帖子???

返回数据

我可以理解为什么用get来更新数据是错误的,但是我不明白为什么每个帖子都要强制更新数据?

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

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

我刚开始阅读有关休息的内容,还有几件我还不了解的事情......