簡體   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