node-soap可以在单个WSDL中处理具有不同命名空间的多个模式吗?

时间:2015-12-16 21:36:23

标签: xml node.js soap wsdl node-soap

我正在使用node-soap与现有的SOAP API进行交互。我遇到了多个模式和命名空间的问题,从我正在阅读的内容来看,这可能是一个已知的问题。这是设置,我正在与一个带有两个模式的WSDL文件连接:

WSDL(为简洁起见,删除了属性和元素):

<wsdl:definitions xmlns:tns="[rm-nsurl]" targetNamespace="[rm-nsurl]" ...>

   <!-- schema1 -->
  <schema xmlns:tns="[cm-nsurl]" targetNamespace="[cm-nsurl]" ...>
    <complexType abstract="true" name="Operation">
      <sequence>
        <element maxOccurs="1" minOccurs="0" name="operator" type="tns:Operator">...</element>
      </sequence>
    </<complexType
  </schema>

   <!-- schema2 -->
  <schema xmlns:cm="[cm-nsurl]" xmlns:tns="[rm-nsurl]" targetNamespace="[rm-nsurl]" ...>
    <complexType name="UserListOperation">
      <complexContent>
        <extension base="cm:Operation">...</extension>
      </complexContent>
    </complexType>
  </schema>

  ...
</wsdl:definitions>

重要的细节是两个模式将tns定义为不同的值。当schema2中的一个类型引用schema1(cm:Operation)中的一个元素时,它使用cm的显式命名空间(到目前为止很好),但随后跳转到schema1中的引用类型,我们现在看到tns在schema1 tns中使用的命名空间是cm。这会导致问题,因为node-soap正在使用tns的单个整体值,在这种情况下恰好是rm,并且在需要时它不会显式使用cm命名空间。

以下是我看到问题的示例:

传递给WSDL方法的请求对象:

{
  operations: [{
    operator: 'SET',
    operand: {
      id: 'abcd1234',
      description: 'a description'
    }
  }]
};

Node-soap生成的请求XML:

<soap:Envelope xmlns:tns="[rm-nsurl]" xmlns:cm="[cm-nsurl]" ...>

  <soap:Body>
    <mutate xmlns="[rm-nsurl]">
      <operations>
        <operator>SET</operator>
        <operand><id>abcd1234</id><description>a description</description></operand>
      </operations>
    </mutate>
  </soap:Body>

</soap:Envelope>

请求错误

[OperatorError.OPERATOR_NOT_SUPPORTED @ operations[0], RequiredError.REQUIRED @ operations[0].operator]

我能够通过在请求对象as mentioned in the readme中手动包含operator元素的cm命名空间来解决问题。我想知道在这种情况下是否有更好的方法来使用node-soap,因为所有必需的信息都在WSDL中指定,或者我遇到了node-soap关于名称空间的一个问题?

以下是与变通方法相同的请求对象:

{
  operations: [{
    'cm:operator': 'SET',
    operand: {
      id: 'abcd1234',
      description: 'a description'
    }
  }]
};

具体细节:This is the WSDL I'm using。我使用mutate操作遇到了这个问题,并且operator元素的命名空间不正确。

0 个答案:

没有答案