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