我是否应该为支持CRUD操作的RESTful API提供单个或多个复杂类型?

时间:2012-08-15 15:28:18

标签: web-services rest xsd schema

我有一个RESTful API支持实体上的CRUD操作。我应该有单个xsd文件来定义所有CRUD操作的模式吗?

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

3 个答案:

答案 0 :(得分:2)

您的问题似乎将字段用法与XSD文件的数量联系在一起,这让我觉得您可能会遗漏一些基本的XSD概念。

假设您的问题是,对于给定的实体,您可以检索 更多 字段而不是更新;在虚构的Person实体上进行说明,您可以 R (etrieve)NameAddressDate of BirthRegistered Since属性,尚未 C (重新)实体,您只允许NameAddressDate 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文件的数量没有任何影响......除非你考虑更多的变量。我会尝试一些我想到的,但我不会提供详尽的清单:

  • 复杂性:如果您尝试解决的问题很简单,那么请尽量保持解决方案的简单性。如上所示,您仍然可以使用一个XSD文件解决“描述性”问题。如果将工具视为问题空间的一部分,许多工具都会遇到XSD之间复杂关系的问题......有时甚至不支持xsd:include,命令行也会变得更复杂。
  • XML命名空间:如果您像我或其他许多人那样希望在描述业务域的构造与支持API定义和消息传递之间保持分离,那么使用不同的XML命名空间是一种常见的解决方案您需要at least与您决定使用的XML命名空间一样多的不同XSD文件。这将驱使您拥有多个XSD文件。
  • 可重复使用的内容:XSD内容可以通过多种方式重复使用。如果您希望在许多项目/接口中看到强制执行的基本类型系统,那么一个好的做法是在一个或多个单独的XSD文件中创建它们,然后通过其他更具体的XSD包含/导入它们。
  • XML架构重构:如果您处于人们使用自动重构的环境中,答案将是:谁在乎?我知道新手发现这一点回答自命不凡;然而,在复杂系统的现实生活中,由于个人偏好(代码/模型评论等)和/或具有不同支持级别的各种工具/平台,您的问题的一些解决方案实际上很难处理,包含XSD代码,XSD重构 很可能是保持平稳运行的唯一方法。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

根据操作,它可以通过以下方式之一处理字段:

  • 必填 - 必须提供且有效。
  • 可选 - 仅当提供且有效时才使用此字段。
  • 忽略 - 服务器忽略此字段。例如,对于create Customer操作,客户端无法设置ID和createdOn字段,服务器将忽略这些字段。

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

当不同操作对实体的使用存在巨大差异时,单独的实体可能是适当的。例如,管理员的检索客户操作可能返回比普通用户可用的更多关于客户的信息。如果这种差异很大,如果定义了单独的实体,则每个人都会更容易。您可以使用架构扩展来扩展基础实体,或者只是复制并粘贴基础实体中的字段,无论您的环境是什么。

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