[英]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.