我正在使用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
元素的命名空间不正确。