是否可以在Web服务中使用多个xsd映射?

时间:2012-08-26 22:48:37

标签: web-services rest soap xsd wsdl

我是Web服务的新手,我正面临一个设计问题,我们想要创建一个Web服务(最好是基于SOAP的),它将获得2个参数:

  • 字符串变量(客户名称);
  • XML数据。

此网络服务目前有2个不同的消费者,但他们的数量会增加。所有消费者都有他们将要发送的单独XSD数据,例如:

消费者1:

<ConData>
    <Customer>
        <FirstName>FirName</FirstName>
        <LastName>LasName</LastName>
    </Customer>
    <Acocunt>
        <Number>112971</Number>
    </Account>
    <Order>
        <OrderNum>0092123</OrderNum>
    </Order>
<ConData>

消费者2:

<ConData>
    <SysData>
        <CustomerFirstName>Name</CustomerFirstName>
        <CustomerLastName>Name</CustomerLastName>
        <AccountNumber>Au1o2n</AccountNumber>
        <OrderNum>koo912</OrderNum>
    </SysData>
<ConData>

此Web服务应该从这些客户端获取XML数据,并根据使用者名称将其存储到数据库中。我们不需要处理来验证XML,我们只需将其存储在数据库中即可。

作为一个好的设计,我想用显式参数定义我的Web服务。问题是,由于他们的XML数据格式不同,我无法在WSDL中使用单个XSD架构作为参数。我可以想到两个选项来解决这个问题:

1。让他们在我的Web服务中将XML数据作为String传递而不是XSD映射参数。虽然这是一种有效的方法,但它似乎是一个糟糕的设计,基于我迄今为止在论坛上所阅读的内容,因为它无效验证并且需要大量的手动编组和解组以及其他问题。另外,我的WSDL将无法向我的客户定义预期的格式等。

2。创建2个独立的Web服务,使用自己的XSD 处理不同的个人消费者。这似乎不太可行,因为将来如果我们添加更多的消费者,我们将不得不为同一操作等添加重复代码的新Web服务。

我一直在寻找是否有办法在单个Web服务WSDL中定义多个XSD,或者是解决此问题的更好方法。

另一方面,我更倾向于使用基于SOAP的Web服务,但如果使用RESTful Web服务以更好的方式解决此问题,那么我也可以考虑这一点。

1 个答案:

答案 0 :(得分:2)

您不需要为每个客户端提供不同的Web服务或框架,您只需要一个不同的WSDL

忘记将这个XML参数作为字符串发送,它有一些缺点,我不会在这里重复,因为你已经读过它了。所以你需要将它作为XML发送。

要将其保留在一个Web服务中,您需要创建Web服务,以便它接受任何XML作为输入(为参数键入<xsd:any>)。类型<xsd:any>将表示任何类型的XML,但至少它可以是XML,您可以为结构验证,对于初学者。

这简化了Web服务的版本控制,因为在添加其他XML类型的输入时不需要更改代码,但遗憾的是您丢失了Web服务的强类型,并且为Web服务生成的WSDL不会说明任何有关它期望的XML结构(任何XML都太模糊)。您的网络服务框架将使用ObjectXmlElementXmlDocument或代码中的任何类型创建。所有客户端存根都会发生同样的情况。

但对于您的客户端,可以通过为每个客户端提供不同的WSDL来修复此问题。

为此,您创建Web服务的WSDL,其中包含除<types>部分之外的所有客户端的公共内容,然后将每个客户端的此公共WSDL与其自己的XML Schema合并。然后,您将在每个客户端的不同URL上公开每个WSDL。

现在,客户端将能够根据自己的特定WSDL生成强类型存根。

当客户端调用您的Web服务时,您会识别客户端XML架构并使用它来验证XML参数并查看它是否是预期的内容。

如果上面看起来很多,那么你总是可以选择一个松散类型的RESTful Web服务。无论您选择哪种解决方案,只需确保使用发送它的客户端的架构验证传入的XML。