Как я могу добавить "пространство имен" для запроса в мыло узла
Я создал объект веб-службы из файла 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 внутри своего проекта (загружается оттуда) и вставил желаемое пространство имен. Это сработало для меня.