【问题标题】:What is the best way to create RESTful complex queries?创建 RESTful 复杂查询的最佳方法是什么?
【发布时间】:2008-12-19 19:35:57
【问题描述】:

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

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

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

我考虑过使用 POST 将描述查询的 XML 对象发送到类似的东西:

http://mydomain/collections/complexQuery

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

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

杰森 S:

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

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

【问题讨论】:

    标签: web-services rest


    【解决方案1】:

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

    我猜您的唯一 ID 方法(带有存储在服务器上的查询定义状态)的一个优点是您可以将查询结果用作另一个查询的参数。甚至可能将 POSTING 查询的定义与查询的执行分开。

    【讨论】:

      【解决方案2】:

      这是标准的 RESTful 方法。 POST 到资源并期望 201 Created(无实体主体)与 Location 标头中创建的结果的 URI。您还可以使用200 OK 响应返回结果,还可以选择使用指向结果的 URI 以供将来在响应中(取消)引用以及结果副本。

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          【解决方案4】:

          对不起,我的无知...

          但为什么不直接在帖子中返回数据???

          我可以理解为什么使用 get 更新数据是错误的,但我不明白为什么必须强制在每个帖子中更新数据?

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

          我也觉得rest的原理之一就是定义无状态(如http协议)的接口,在这种情况下服务器是在维护一个状态来解决查询...

          我刚刚开始阅读有关休息的内容,并且有几件事我还不明白......

          【讨论】:

            猜你喜欢
            • 2011-04-26
            • 2011-09-03
            • 2016-02-23
            • 2016-04-13
            • 2012-02-19
            • 2012-10-22
            • 2017-08-06
            • 1970-01-01
            • 2020-07-30
            相关资源
            最近更新 更多