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

Я создал объект веб-службы из файла 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>...

как вы видите, soap модуль не добавляет tns пространство имен для запроса. Я пытался!--4-->, Он добавляет пространство имен к параметру, но все же не добавляет пространство имен в запросу 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 client,

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 by tns опять же, он по-прежнему не работает. Вы должны использовать другое значение в качестве пространства имен, например myns