从REST服务检索复杂查询的最佳方法是什么?
假设我想要获取X集合,为每个集合应用过滤器和方程式,使用其他操作组合集合并返回一个结果,一个请求中的所有内容。
将所有内容放在查询字符串中太复杂(太大),因为我可以组合300多个集合(加上每个集合的运算符和过滤器)。
我考虑使用POST将描述查询的XML对象发送到:
http://mydomain/collections/complexQuery
它将返回一个唯一的ID,然后我可以使用GET来检索complexQuery结果:
http://mydomain/collections/complexQuery/{queryId}
Jason S:
这就是主意。 POST将采用查询的XML表示,其中“where”参数已经存在(它们可能太多)。只有在GET到达时才会执行查询。我可以让查询对象可用一段时间并稍后删除它。
这是一个很好的解决方案吗?我还在RESTful吗?
答案 0 :(得分:2)
这是标准的RESTful方法。对资源POST
并期望201 Created
(没有实体主体)在Location
标头中创建结果的URI。您还可以使用200 OK
响应返回结果,还可以选择一个URI,指向响应中未来(de)引用的结果以及结果副本。
答案 1 :(得分:2)
如果您使用的是唯一身份证件,我会发现RESTful。如果查询结果集很大,您可能希望包含一种询问结果集行M-N的方法,其中M,N是参数。
我猜你的唯一ID方法的优势(w /查询定义状态存储在服务器上)是你可以使用查询的结果作为另一个查询的参数。甚至可能从查询的执行中分离出查询的定义。
答案 2 :(得分:1)
没关系。但它引入了一些问题:
如果您清除旧查询,则表示您无法提供已保存查询的链接,因为它们可能已经被清除过。
即使是简单的查询也需要两次往返(POST& then GET)
param1=val1¶m2=val2
答案 3 :(得分:1)
但为什么不用帖子???
返回数据我可以理解为什么用get来更新数据是错误的,但是我不明白为什么每个帖子都要强制更新数据?
我也理解这个想法是每个get方法都可能被缓存(因为它们不会修改数据),但在这种情况下,如果临时保存的查询仍处于活动状态,它们只能被缓存...另一层复杂性......
我还认为休息的原则之一是定义无状态(如http协议)接口,在这种情况下服务器维护一个状态来解决查询......
我刚开始阅读有关休息的内容,还有几件我还不了解的事情......