Как добавить "пространство имен" для запроса в узле 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