Может ли узел-мыло обрабатывать несколько схем с разными пространствами имен в одном WSDL?
Я использую 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
, Это вызывает проблему, поскольку мыло-узел использует одно общее значение для tns
который в этом случае оказывается rm
и он явно не использует cm
пространство имен при необходимости.
Вот пример, где я вижу проблему:
Объект запроса передан методу WSDL:
{
operations: [{
operator: 'SET',
operand: {
id: 'abcd1234',
description: 'a description'
}
}]
};
XML-запрос, сгенерированный Node-soap:
<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]
Я могу обойти эту проблему, вручную включив пространство имен cm для operator
элемент в объекте запроса, как указано в файле readme. Я задаюсь вопросом, есть ли лучший способ использовать мыло узла в этой ситуации, так как вся необходимая информация указана в WSDL, или я столкнулся с одним из изгибов, которые мыло узла имеет относительно пространств имен?
Вот тот же объект запроса с обходным решением:
{
operations: [{
'cm:operator': 'SET',
operand: {
id: 'abcd1234',
description: 'a description'
}
}]
};
Конкретные детали: это WSDL, который я использую. Я сталкиваюсь с этой проблемой, используя mutate
операция и это operator
элемент, который получает пространство имен неправильно