繁体   English   中英

如何在REST中传递复杂查询?

[英]How to pass complex queries in REST?

如果我理解正确,在休息样式中,每个查询(即,每个不修改资源状态的资源上的每个操作)都应该使用get方法在查询字符串中进行编码,而根本没有正文。

我对吗?

好吧,我有几个应用程序通过由Visual Basic 6组件处理的XML消息与db通信。

查询的消息是这样的

<xml>
  <service>account</service>
  <resource>invoice</resource>
  <action>query</action>
  <parameters>
    <page>1</page>
    <page_len>10</page_len>
    <order>date</order>
    <fields>*</fields>
    <conditions>
      <date>2009-01-01..2009-01-31</date>
      <customer_id>24</customer_id>
    </conditions>
  </parameters>
</xml>

现在我们正在重新设计我们的XML消息,我们希望这样做可以很容易地映射到RESTful接口。

在前面的例子中,我们需要“conditions”标签以防止参数和条件之间的冲突(即,如果我有一个名为“order”,“page”或类似的字段会发生什么......

我们虽然关于发送带有前缀的参数,例如

http://account/invoice/?_page=1&_page_len=10&_order=date&_fields=*&date=2009-01-01..2009-01-31&customer_id=24

而XML就像是

[...]
    <_order>date</_order>
    <_fields>*</_fields>
    <date>2009-01-01..2009-01-31</date>
    <customer_id>24</customer_id>
[...]

我们正在尝试为crud操作定义一些非常简单的XML格式,并且生成的XML可以很容易地映射到rest或JSON。

您如何在休息应用程序中映射这种查询? 是否有一些标准定义? 或者一些带有crud rest / XML / JSON样本的页面? 如何返回错误或嵌套数据集?

非常感谢。

恕我直言,为了使您的系统真正RESTful,您必须重新考虑您将发送的所有消息/查询。

这部分:

<conditions>
  <date>2009-01-01..2009-01-31</date>
  <customer_id>24</customer_id>
</conditions>

是棘手的部分。 你有什么其他条件? 有很多吗? 这个特殊的例子使我认为您可以将发票视为客户的子资源。 当我休息时,我总是尝试识别路径中的资源,如果查询stil需要任何参数,我将它们移动到查询字符串。 所以我会写这样的东西:

GET /customers/24/invoices?start_date=2009-01-01&end_date=2009-01-31

考虑一下你的资源之间的关系。 假设我们通过a-to-many关系有资源类型Foo相关资源类型Bar。 在这种情况下,你可以问这样的关系: GET /foo/123/bar并添加查询字符串参数来过滤它。 当您想要以涉及与其他资源的关系的方式过滤它时,问题就开始了。 恕我直言,这意味着您的资源设计不是真正的RESTful。

您需要对xml进行url编码以便能够传递它,但是,如果您将xml转换为json,那么您可以传递该字符串,然后使用json-> xml或json-> object来处理它。 这将使您能够传递更复杂的对象。

它不完美,但有效。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM