我有一个RESTful API支持实体上的CRUD操作。我应该有单个xsd文件来定义所有CRUD操作的模式吗?
我问这个问题的原因是,我有一些字段仅与Retrieve调用相关,而不适用于Create或Update。在这种情况下,我应该有一个xsd文件并忽略一些创建和更新字段吗?
答案 0 :(得分:2)
您的问题似乎将字段用法与XSD文件的数量联系在一起,这让我觉得您可能会遗漏一些基本的XSD概念。
假设您的问题是,对于给定的实体,您可以检索 更多 字段而不是更新;在虚构的Person
实体上进行说明,您可以 R (etrieve)Name
,Address
,Date of Birth
和Registered Since
属性,尚未 C (重新)实体,您只允许Name
,Address
和Date of Birth
- 您希望后端系统设置{{1} }属性。要求是尽可能地约束XSD,以改善模型的自描述性。
您可以通过创建XSD基本类型来实现这些场景的分离,然后使用另一种类型扩展它,然后包含您想要的额外字段。你可以在一个文件或两个或多个不同的文件中做这种事情。
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:group
- 对XSD文件的数量没有任何影响......除非你考虑更多的变量。我会尝试一些我想到的,但我不会提供详尽的清单:
答案 1 :(得分:0)
如果您有不同的字段用于不同的调用,那么您应该使用不同的XSD文件,但如果您只是根据CRUD操作将某些字段留空,则您不需要创建不同的文件。未使用的字段将存在,但它们将留空。
答案 2 :(得分:0)
根据操作,它可以通过以下方式之一处理字段:
对于简单的情况,我将使用单个模式元素来定义实体。我将解决文档中字段的实际用法。
当不同操作对实体的使用存在巨大差异时,单独的实体可能是适当的。例如,管理员的检索客户操作可能返回比普通用户可用的更多关于客户的信息。如果这种差异很大,如果定义了单独的实体,则每个人都会更容易。您可以使用架构扩展来扩展基础实体,或者只是复制并粘贴基础实体中的字段,无论您的环境是什么。
PS。大多数Web服务堆栈(至少在JAX-RS和JAX-WS中)默认情况下不强制执行架构合规性。检查Web服务代码中字段的有效性是个好主意。