Может ли узел-мыло обрабатывать несколько схем с разными пространствами имен в одном 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 элемент, который получает пространство имен неправильно

0 ответов

Другие вопросы по тегам