2009-06-08 79 views
2

我們有一個使用POST的ReST Web服務 - 將數據插入數據庫(取消XML數據)和GET檢索數據(編組爲XML)。使用XML和XSD映射數據庫的最佳實踐

XSD用於生成Java對象(通過Sun的JAXB編譯器),以便將數據收集到數據庫或從數據庫收集數據。 我們種凍結了這個XSD,因爲我們認爲這個模型完美的數據 - 它的確如此,但是只能發佈數據。

現在時間到了GET來自數據庫的數據,我發現自己不得不「破壞」我們當前的XSD,並允許它發佈POST類型請求不關心的主鍵和其他數據值,它們是多餘的。

所以 - 實際上XSD現在有可選的元素(即那些只用於GET請求的元素)。當您必須向想要使用您的Web服務的第三方解釋時,這可能會導致潛在的混淆,並且您有此XSD在獲取和發佈數據之間具有一種分離的個性。它也不像以前那樣感覺乾淨和優雅。

我該怎麼辦?在您的XSD中只有在某些情況下才會使用的元素(如獲取數據)可以嗎?或者我應該有2個XSD - 一個更詳細,爲GET請求量身定製,另一個量身打造,純粹用於POST請求?

您的幫助和建議 - 非常感謝。

回答

1

我處於類似的情況,並創建了一個我用於「閱讀」目的的視圖。然後將視圖映射到與主表格相同的XSD中,以便我可以在一個位置管理它。它給了我「寬鬆」閱讀的靈活性,而不必擔心會破壞我的主要數據安排。

+0

你認爲它最清潔的解決方案 - 最佳? – Vidar 2009-06-08 18:17:38

1

只要您充分記錄,只有在某些情況下使用的字段才能在XML文檔中使用。 UDDI(是的,我知道,一個徹底的非REST和非酷的例子)就是這樣做的。當您在UDDI中「保存」或「更新」一個條目時,類似於您的POST和PUT,您需要在發佈的數據中提供唯一的ID,以便服務器知道如何處理它。這樣做的好處是,您有一個模式元素和一個結果數據結構來處理該數據結構上的大多數操作(對於CRU,但對於UDDI中的D,並不總是)。由於您是RESTful的並且可以在資源的URL中表示唯一標識符,因此這種方法對於您的應用程序可能不太合適。有一點需要考慮的是,如果檢索到的數據要在檢索後傳遞。如果數據需要自包含並且在客戶端的不同上下文之間或之間傳遞,那麼包含該ID可能對您的服務的用戶有用,因爲它們不必處理兩段數據(實際數據及其唯一標識符)。也就是說,您的客戶可能完全抽象出REST/XML交互,在這種情況下,它們的抽象可能已經處理了數據結構的ID和其餘字段。