2016-06-28 36 views
0

我试图使用IBM铸铁软层SOAP服务。走出了门,我得到了可下载here的softlayer wsdl的验证错误。氧气v18的验证也失败了。在这两种情况下,错误都发生在wsdl中的这个include spec中:SoftLayer WSDL验证失败

<xsd:schema targetNamespace="http://api.service.softlayer.com/soap/v3/"> 
    <xsd:include namespace="http://api.service.softlayer.com/soap/v3/" 
    schemaLocation="https://api.softlayer.com/soap/v3/SoftLayer_Account?xsd"/> 
</xsd:schema> 

并且这是错误。

cvc-complex-type.3.2.2:属性'namespace'不允许出现在元素'xsd:include'中。

ok,命名空间不是include规范的有效属性。很难相信全世界使用的软件的wsdl成功使用(除了我)是无效的。我删除了命名空间属性,然后我发现类型定义无法在对tns:SoftLayer_Account的元素规范引用上解析。

<xsd:schema targetNamespace="http://api.service.softlayer.com/soap/v3/"> 
    <xsd:complexType name="SoftLayer_AccountObjectMask"> 
    <xsd:sequence> 
     <xsd:element minOccurs="1" maxOccurs="1" name="mask" type="tns:SoftLayer_Account"/> 
    </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 

和这样的错误在wsdl操作规范的上下文中的一大堆错误。

未指定SOAP标头的名称空间。当使用编码时,必须定义名称空间URI。

这里是发生错误的操作之一。

<operation name="addReferralPartnerPaymentOption"> 
    <soap:operation soapAction="http://api.service.softlayer.com/soap/v3/SoftLayer_AccountAction"/> 
    <input> 
    <soap:header message="tns:authenticateHeader" part="authenticate" use="encoded" 
     encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
... 

对于上下文,这里是wsdl的开始行。

<?xml version="1.0" encoding="UTF-8"?> 
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:tns="http://api.service.softlayer.com/soap/v3/" 
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" name="slApi" 
    targetNamespace="http://api.service.softlayer.com/soap/v3/"> 
    <types> 
    <xsd:schema targetNamespace="http://api.service.softlayer.com/soap/v3/"> 
     <xsd:include namespace="http://api.service.softlayer.com/soap/v3/" 
     schemaLocation="https://api.softlayer.com/soap/v3/SoftLayer_Account?xsd"/> 
    </xsd:schema> 
    <xsd:schema targetNamespace="http://api.service.softlayer.com/soap/v3/"> 
     <xsd:complexType name="SoftLayer_AccountObjectMask"> 
     <xsd:sequence> 
      <xsd:element minOccurs="1" maxOccurs="1" name="mask" type="tns:SoftLayer_Account"/> 
     </xsd:sequence> 
     </xsd:complexType> 
    </xsd:schema> 
    </types> 
    <message name="activatePartner"> 
    <part name="accountId" type="xsd:string"/> 
    <part name="hashCode" type="xsd:string"/> 
    </message> 
... 

而包含模式的头部SoftLayer_Account.xsd。

<?xml version="1.0" encoding="UTF-8"?> 
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:tns="http://api.service.softlayer.com/soap/v3/" 
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" name="slApi" 
    targetNamespace="http://api.service.softlayer.com/soap/v3/"> 
    <types> 
    <xsd:schema targetNamespace="http://api.service.softlayer.com/soap/v3/"> 
     <xsd:include namespace="http://api.service.softlayer.com/soap/v3/" 
     schemaLocation="https://api.softlayer.com/soap/v3/SoftLayer_Account?xsd"/> 
    </xsd:schema> 
    <xsd:schema targetNamespace="http://api.service.softlayer.com/soap/v3/"> 
     <xsd:complexType name="SoftLayer_AccountObjectMask"> 
     <xsd:sequence> 
      <xsd:element minOccurs="1" maxOccurs="1" name="mask" type="tns:SoftLayer_Account"/> 
     </xsd:sequence> 
     </xsd:complexType> 
    </xsd:schema> 
    </types> 
    <message name="activatePartner"> 
    <part name="accountId" type="xsd:string"/> 
    <part name="hashCode" type="xsd:string"/> 
    </message> 
... 

我期待从softlayer构造良好的WSDL,它可能是。这只是我对wsdl和xml这个话题的一个白痴,所以任何帮助都会被赞赏!

感谢, 帕克

回答

0

这是怪,SOFTLAYER WSDL正常工作与工具,如从Visual Studio SOAP UI或WSDL.EXE。您不能从WSDL中删除XSD引用,否则会遇到您在帖子中描述的问题。

您可以尝试通过改变标签,看看是否能工程,看看这个帖子XSD with elements from other namespace

无论如何,我认为你所面临的问题是由于您所使用的工具,而不是由于softlayer错误的WSLD。

+0

要清楚,我只删除命名空间属性,所以包含看起来像这样。 当我这样做时,错误就会消失。但然后我得到解决类型定义失败。 难道是最新的xsd:include规范不允许带有包含的名称空间属性,因为该名称空间是隐含的吗?即包含意味着相同的名称空间而不是导入。 – user3208130

+0

另一个有趣的事情是,当我使用代码辅助时,氧气会显示tns:SoftLayer_Account作为定义的类型。再一次,氧气和铸铁都没有出于同样的原因进行验证。 我会尝试其他方法,如SOAPUI,但我怀疑氧气和铸铁使用相同的xml支持罐是非常新的。 无论如何,我不能让铸铁工作,除非我可以重新编码wsdl和/或xsds。我会继续黑客攻击,我会采取任何建议! – user3208130

+0

我放弃尝试使用SOAP API。我在那个wsdl中砍了很长一段时间,并得出结论,无论谁使用软层SOAP服务都使用不关心WSDL无法验证的程序或工具。您无法告诉Cast Iron不要验证wsdl,因此开箱即用的WSDL是该工具的非启动器。我在Cast Iron上成功地使用了REST,至少这是一个解决方法。我不确定这应该是答案,而不是评论? – user3208130

0

那么它不是一个答案,但至少它是一个解决方法。我的解决方案是使用REST API来处理使用铸铁而不是SOAP的软层服务。