2

我有一个支持对实体进行 CRUD 操作的 RESTful API。我应该有一个 xsd 文件来定义所有 CRUD 操作的架构吗?

我问这个问题的原因是,我有一些仅与检索调用相关而不与创建或更新相关的字段。在这种情况下,我应该有一个 xsd 文件并忽略一些用于创建和更新的字段吗?

4

3 回答 3

2

您的问题似乎将字段使用与 XSD 文件的数量联系在一起,这让我认为您可能缺少一些基本的 XSD 概念。

假设您的问题是,对于给定的实体,您可能会检索到比您可以更新的更多的字段;在虚拟Person实体上进行说明,您可以R(获取)NameAddress和属性,但要Date of BirthC 重新创建)实体,您只允许,和- 您希望后端系统设置属性。要求是尽可能约束XSD,以提高模型的自描述性。Registered SinceNameAddressDate of BirthRegistered 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 文件解决您的“描述性”问题。如果您将工具视为问题空间的一部分,那么许多工具都存在 XSD 之间复杂关系的问题……有时甚至不支持 xsd:include,命令行变得更加复杂。
  • XML 命名空间:如果您像我或许多其他人一样希望将描述您的业务域的构造与支持您的 API 定义和消息传递的构造分开,那么使用不同的 XML 命名空间是一种常见的解决方案。您需要至少与您决定使用的 XML 名称空间一样多的不同 XSD 文件。这将驱使您拥有多个 XSD 文件。
  • 可重用内容:XSD 内容可以通过多种方式重用。如果您希望在许多项目/接口中强制实施一个基本类型系统,那么一个好的做法是将它们编写到一个或多个单独的 XSD 文件中,然后通过其他更具体的 XSD 包含/导入它们。
  • XML Schema Refactoring:如果您处于人们使用自动重构的环境中,答案将是:谁在乎?我第一手知道新手觉得这个答案很自命不凡。然而,在具有复杂系统的现实生活中,由于个人偏好(代码/模型审查等)和/或具有不同支持级别的各种工具/平台,您的问题的某些解决方案实际上很难处理, XSD 到代码包括在内,XSD 重构可能是保持事情顺利运行的唯一方法。
于 2012-08-20T17:09:14.233 回答
0

如果您对不同的调用有不同的字段,那么是的,您应该使用不同的 XSD 文件,但是如果您只根据 CRUD 操作将某些字段留空,那么您不需要创建不同的文件。未使用的字段将在那里,但它们将留空。

于 2012-08-17T22:17:46.767 回答
0

根据操作,它可能会以下列方式之一处理字段:

  • 必需- 必须提供且有效。
  • 可选- 此字段仅在提供且有效时使用。
  • 已忽略- 服务器忽略此字段。例如,对于 create Customer 操作,ID 和 createdOn 字段不能由客户端设置,被服务器忽略。

对于简单的情况,我将使用单个模式元素来定义实体。我将解决文档中字段的实际用法。

当不同操作对实体的使用存在巨大差异时,单独的实体可能是合适的。例如,管理员的检索客户操作可能会返回比普通用户可用的更多的有关客户的信息。如果这种差异很大,那么定义单独的实体对每个人来说都会更容易。您可以使用模式扩展来扩展基本实体,或者简单地从基本实体复制和粘贴字段,无论在您的环境中是否有效。

PS。大多数 Web 服务堆栈,至少在 JAX-RS 和 JAX-WS 中,默认情况下不强制执行模式合规性。检查 Web 服务代码中字段的有效性是一个好主意。

于 2012-08-24T13:45:53.637 回答