我有一个 RESTful API,支持实体上的 CRUD 操作。我应该有一个 xsd 文件来定义所有 CRUD 操作的架构吗?
我问这个问题的原因是,我有一些字段仅与检索调用相关,与创建或更新无关。在这种情况下,我是否应该拥有一个 xsd 文件并忽略创建和更新的某些字段?
最佳答案
您的问题似乎将字段使用与 XSD 文件数量联系在一起,这让我认为您可能缺少一些基本的 XSD 概念。
假设您的问题是,对于给定实体,您可能检索更多字段,而无法更新;在虚构的 Person
实体上进行说明时,您可以R(检索)姓名
、地址
、日期出生
和 注册时间
属性,但要 C(重新创建)实体,您只允许使用 Name
、地址
和出生日期
- 您希望后端系统设置注册时间
属性。要求是尽可能的约束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 无意说明 XSD 最佳实践
如果您的环境不允许扩展/限制,您可以通过 xsd:group
实现重用 - 这不会改变我的观点。所以,我基本上是说您问这个问题的原因 - 我有一些字段仅与检索调用相关,而不与创建或更新相关。
-与 XSD 文件的数量没有任何关系...除非您考虑更多变量。我会尝试一些我想到的,但我不会提供详尽的列表:
- 复杂性:如果您要解决的问题很简单,那么请尽量使解决方案保持简单。如上所示,您仍然可以使用一个 XSD 文件来解决“描述性”问题。如果您将工具视为问题空间的一部分,那么许多工具都存在 XSD 之间复杂关系的问题...有时甚至不支持 xsd:include,并且命令行变得更加复杂。
- XML 命名空间:如果您像我或许多其他人一样希望将描述您的业务领域的构造与支持 API 定义和消息传递的构造分开,那么可以使用不同的 XML 命名空间是一个常见的解决方案。您需要at least您决定使用的不同 XSD 文件与 XML 命名空间一样多。这会导致您拥有多个 XSD 文件。
- 可重用内容:XSD 内容可以通过多种方式重用。如果您有一个基本类型系统,希望在许多项目/接口(interface)中强制执行,那么一种好的做法是在一个或多个单独的 XSD 文件中编写它们,然后通过其他更具体的 XSD 包含/导入它们。
- XML 架构重构:如果您处于人们使用自动重构的环境中,答案将是:谁在乎?我知道新手会发现这一点回答做作;然而,在复杂系统的现实生活中,由于个人喜好(代码/模型审查等)和/或具有不同支持级别的各种工具/平台,您的问题的某些解决方案实际上很难处理,包括 XSD 到代码,XSD 重构很可能是保持事情顺利运行的唯一方法。
关于web-services - 对于支持 CRUD 操作的 RESTful API,我应该使用单个或多个复杂类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11972309/