我是Web服务的新手,我正面临一个设计问题,我们想要创建一个Web服务(最好是基于SOAP的),它将获得2个参数:
此网络服务目前有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服务以更好的方式解决此问题,那么我也可以考虑这一点。
答案 0 :(得分:2)
您不需要为每个客户端提供不同的Web服务或框架,您只需要一个不同的WSDL 。
忘记将这个XML参数作为字符串发送,它有一些缺点,我不会在这里重复,因为你已经读过它了。所以你需要将它作为XML发送。
要将其保留在一个Web服务中,您需要创建Web服务,以便它接受任何XML作为输入(为参数键入<xsd:any>
)。类型<xsd:any>
将表示任何类型的XML,但至少它可以是XML,您可以为结构验证,对于初学者。
这简化了Web服务的版本控制,因为在添加其他XML类型的输入时不需要更改代码,但遗憾的是您丢失了Web服务的强类型,并且为Web服务生成的WSDL不会说明任何有关它期望的XML结构(任何XML都太模糊)。您的网络服务框架将使用Object
,XmlElement
,XmlDocument
或代码中的任何类型创建。所有客户端存根都会发生同样的情况。
但对于您的客户端,可以通过为每个客户端提供不同的WSDL来修复此问题。
为此,您创建Web服务的WSDL,其中包含除<types>
部分之外的所有客户端的公共内容,然后将每个客户端的此公共WSDL与其自己的XML Schema合并。然后,您将在每个客户端的不同URL上公开每个WSDL。
现在,客户端将能够根据自己的特定WSDL生成强类型存根。
当客户端调用您的Web服务时,您会识别客户端XML架构并使用它来验证XML参数并查看它是否是预期的内容。
如果上面看起来很多,那么你总是可以选择一个松散类型的RESTful Web服务。无论您选择哪种解决方案,只需确保使用发送它的客户端的架构验证传入的XML。