Как я могу добавить "пространство имен" для запроса в мыло узла

Я создал объект веб-службы из файла wsdl и назвал его, как показано ниже. Я также печатаю результат. этот код не работает. веб-сервер возвращает ошибку. потому что запрос не имеет пространства имен.

soap.createClient(__dirname + '/wsdl/getCustomerDetails.wsdl', function(err, client) {
.
.
var params=  {"custId":"123"};
client.getCustomerDetails.getCustomerDetailsPort.getCustomerDetails(params,function(err,result){
    console.log("lastRequest:"+client.lastRequest);
    if (err != null)
        console.log("error:"+JSON.stringfy(error));

});

}

вот что я вижу в последнем запросе

<soap:...  xmlns:tns="http://example.com/api/getCustomerDetails/V01" >
....
  <soap:Body>
     <getCustomerDetailsRequest>
         <custId>123</custId>
     </getCustomerDetailsRequest>
  </soap:Body>...

но это должно быть

<soap:...  xmlns:tns="http://example.com/api/getCustomerDetails/V01" >
    ....
   <soap:Body>
     <tns:getCustomerDetailsRequest>
        <tns:custId>123</tns:custId>
     </tns:getCustomerDetailsRequest>
   </soap:Body>...

как видите, мыльный модуль не добавляет tns Пространство имен для запроса. Я старался var params= {"tns:custId":"123"};, он добавляет пространство имен к параметру, но все равно не добавляет пространство имен к запросу, getCustomerDetailsRequest, из-за этого я получаю Unexpected element getCustomerDetailsRequest found. Expected {http://example.com/api/getCustomerDetails/V01}getCustomerDetailsRequest,

Как я могу заставить это пространство имен добавить сам метод?

1 ответ

Решение

Я нашел, как я могу это сделать. Я думаю, что он не работает по умолчанию из-за ошибки в модуле "мыло". По умолчанию он не добавляет пространство имен в тело запроса. "soap" использует "tns" по умолчанию в качестве пространства имен. в wsdlOptions есть опция это overrideRootElement, Если вы попытаетесь переопределить overrideRootElement с tnsне добавляет tns в тело запроса. Вы должны использовать другое пространство имен в overrideRootElement, Здесь мое решение,

Я сначала создаю свой wsdlOptions объект.

var wsdlOptions = {
  "overrideRootElement": {
    "namespace": "myns",
    "xmlnsAttributes": [{
      "name": "xmlns:myns",
      "value": "http://example.com/api/getCustomerDetails/V01"
    }]
  }
};

а затем использовать его, когда я создаю мыльный клиент,

soap.createClient(__dirname + '/wsdl/getCustomerDetails.wsdl',wsdlOptions, function(err, client) {
.
.
.
}
);

Это делает тело запроса использует myns как пространство имен корневого элемента. Теперь я должен изменить пространство имен параметров, поэтому я определил параметры как

var params=  {"myns:custId":"123"};

Теперь он создает запрос как

<soap:...  xmlns:tns="http://example.com/api/getCustomerDetails/V01" >
    ....
   <soap:Body>
     <myns:getCustomerDetailsRequest xmlns:myns="http://example.com/api/getCustomerDetails/V01">
        <myns:custId>123</tns:custId>
     </myns:getCustomerDetailsRequest>
   </soap:Body>...

и теперь веб-сервер принимает это.

имейте в виду, даже tns определяется в корне, он не добавляется в тело запроса автоматически. Кроме того, если вы попытаетесь переопределить его в wsdlOptions от tns опять же все равно не работает. Вы должны использовать другое значение в качестве пространства имен, например myns

Я когда-то останавливался на этой проблеме, пока не увидел, что библиотека получает пространства имен из проанализированного WSDL (this.wsdl.xmlnsInEnvelope)

xml = '<?xml version="1.0" encoding="utf-8"?>' +
        '<' + envelopeKey + ':Envelope ' +
        xmlnsSoap + ' ' +
        'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
        encoding +
        this.wsdl.xmlnsInEnvelope + '>' +

Затем я сохранил WSDL внутри своего проекта (загружается оттуда) и вставил желаемое пространство имен. Это сработало для меня.

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