2012-08-15 29 views
2

我有一個RESTful API支持實體上的CRUD操作。我應該有單一的xsd文件來定義所有CRUD操作的模式嗎?對於支持CRUD操作的RESTful API,我應該擁有單個還是多個複雜類型?

我問這個問題的原因是,我有一些只與檢索調用相關的字段,而不是用於創建或更新。在這種情況下,我是否應該有一個xsd文件並忽略創建和更新的某些字段?

+1

我想問一下「有多少個XSD文件?」你真的在問「多少個單獨的元素或複雜的類型」。你能解決這個問題嗎?文件數目沒有相關性,除非我完全錯過了這個問題。 – RajV 2012-08-24 13:47:33

+1

感謝您的糾正,我編輯了這個問題。 – 2012-08-27 02:16:49

回答

2

你的問題似乎將字段的使用與XSD文件的數量聯繫在一起,這讓我覺得你可能在一些基本的XSD概念上缺少。

比方說,你的問題是,對於一個給定的實體,您可以檢索領域比你可以更新;說明在一個虛構的Person的實體,您可以[R(etrieve)的NameAddressDate of BirthRegistered Since屬性,尚未Ç(reate)的實體,您只允許NameAddressDate of Birth - 你想要的後端系統設置Registered Since屬性。要求是儘可能地限制XSD,以提高模型的自描述性。

您可以通過創建XSD基本類型來實現這些場景的分離,然後使用其他類型進行擴展,然後再包含所需的額外字段。您可以在單個文件或兩個或更多不同文件中執行此類操作。

<?xml version="1.0" encoding="utf-8" ?> 
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)--> 
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

    <xsd:complexType name="PersonBase"> 
     <xsd:sequence> 
      <xsd:element name="Name"/> 
      <xsd:element name="Address"/> 
      <xsd:element name="DateOfBirth"/> 
     </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="PersonToRetrieve"> 
     <xsd:complexContent> 
      <xsd:extension base="PersonBase"> 
       <xsd:sequence> 
        <xsd:element name="RegisteredSince"/> 
       </xsd:sequence> 
      </xsd:extension> 
     </xsd:complexContent> 
    </xsd:complexType> 
</xsd:schema> 

注意:上面的XSD不intented說明XSD最佳實踐

如果擴展/限制並不在您的環境允許,你可以憑藉xsd:group實現再利用 - 它不改變我的觀點。所以,我基本上說,你問這個問題的原因 - I have some fields that are relevant only for Retrieve calls and not for Create or Update. - 對XSD文件的數量沒有任何影響......除非你考慮更多的變量。我會嘗試一些浮現在我的腦海裏,但我不打算提供一個詳盡的清單:

  • 複雜:如果你試圖解決這個問題很簡單,然後儘量保持解決方案簡單。如上所示,您仍然可以使用一個XSD文件解決您的「描述性」問題。如果您將工具視爲問題空間的一部分,許多工具都會遇到XSD之間複雜關係的問題......有時,甚至不支持xsd:include,命令行也變得更加複雜。
  • XML命名空間:如果您像我或其他許多人希望在描述您的業務領域與支持您的API定義和消息傳遞的構造之間保持分離,那麼使用不同的XML名稱空間是一種常見的解決方案。您需要at least許多不同的XSD文件作爲您決定使用的XML名稱空間。這會讓你擁有多個XSD文件。
  • 可重用內容:XSD內容可以多種方式重用。如果你有一個基本類型系統,你希望在許多項目/接口中看到強制執行,那麼一個好的做法是將它們編寫在一個或多個單獨的XSD文件中,然後通過其他更具體的XSD包含/導入它們。
  • XML模式重構:如果您處於人們使用自動重構的環境中,答案將是:誰在乎?我知道第一手,新手發現這個答案自命不凡;然而,在現實生活中使用複雜系統時,由於個人偏好(代碼/模型評審等)和/或具有不同支持級別的各種工具/平臺,您的問題的某些解決方案實際上很難處理, XSD代碼包括,XSD重構最有可能的唯一方法,讓事情順利進行。
0

如果您對不同的調用有不同的字段,那麼您應該使用不同的XSD文件,但是如果根據CRUD操作只留下一些空白字段,則不需要創建不同的文件。未使用的字段將在那裏,但它們只會留空。

0

根據不同的操作,但可在這些方式中的一種治療領域:

  • 要求 - 必須提供有效的。
  • 可選 - 該字段僅在提供且有效的情況下使用。
  • 忽略 - 服務器忽略此字段。例如,對於創建Customer操作,ID和createdOn字段不能由客戶端設置,並被服務器忽略。

對於簡單情況,我將使用單個模式元素來定義實體。我將解決文檔中字段的實際用法。

當不同操作使用實體時存在巨大差異時,單獨的實體可能是合適的。例如,管理員的檢索客戶操作可能會返回更多關於客戶的信息,而不是普通用戶可用的信息。如果這種差異很大,如果定義了單獨的實體,每個人都會更容易。您可以使用模式擴展來擴展基本實體,或者只需複製並粘貼基本實體中的字段,無論您的環境是否工作。

PS。大多數Web服務堆棧,至少在JAX-RS和JAX-WS中,默認情況下不強制實施模式合規性。檢查Web服務代碼中字段的有效性是一個好主意。

相關問題