【问题标题】:Is it possible to have multiple xsd mappings in a webservice?是否可以在 web 服务中有多个 xsd 映射?
【发布时间】:2012-08-26 22:48:36
【问题描述】:

我是 Web 服务的新手,我面临一个设计问题,我们希望创建一个接收 2 个参数的 Web 服务(最好是基于 SOAP):

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

目前有 2 个不同的用户使用此 Web 服务,但他们的数量将会增加。所有消费者都有将要发送的单独 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 模式作为参数。我可以想到 2 个选项来解决这个问题:

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

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

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

附带说明,我更喜欢基于 SOAP 的 Web 服务,但如果使用 RESTful Web 服务以更好的方式解决此问题,那么我也可以考虑。

【问题讨论】:

    标签: web-services rest soap xsd wsdl


    【解决方案1】:

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

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

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

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

    但是对于您的客户,这可以通过为每个客户提供不同的 WSDL 来从 WSDL 中解决。

    为此,您可以为所有客户端创建一个包含通用内容的 Web 服务 WSDL,&lt;types&gt; 部分除外,然后将每个客户端的这个通用 WSDL 与它们自己的 XML 模式合并。然后,您将在每个客户端的不同 URL 上公开每个 WSDL。

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

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

    如果以上内容看起来很多,那么您总是可以选择松散类型的 RESTful Web 服务。不管你选择什么解决方案,只要确保你使用发送它的客户端的模式来验证传入的 XML。

    【讨论】:

      猜你喜欢
      • 2012-07-16
      • 2021-03-21
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 2011-11-27
      相关资源
      最近更新 更多