6

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

我对吗?

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

查询的消息是这样的

<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 接口。

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

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

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。

您将如何在 REST 应用程序中映射这种查询?是否定义了一些标准?还是一些带有杂乱无章/ XML / JSON示例的页面?返回错误或嵌套数据集怎么样?

非常感谢。

4

2 回答 2

6

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

这部分:

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

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

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

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

于 2009-05-16T18:57:07.697 回答
0

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

它并不完美,但有效。:)

于 2009-05-16T18:36:19.010 回答