调用Amadeus服务时SOAP WSDL动态请求体异常:自动添加多余标签
问题原因与解决方案
一、多余前缀ota_2003_05的原因
ota_2003_05是npm soap库自动生成的命名空间前缀,对应WSDL中定义的http://www.opentravel.org/OTA/2003/05命名空间。你的预期请求使用默认命名空间(通过xmlns="http://www.opentravel.org/OTA/2003/05"声明),而soap库默认用显式前缀标识命名空间,从而生成了多余的前缀标签。
二、@HotelCode变成子元素的原因
soap库识别XML属性的规则不是@前缀,而是需要用$或_attr字段定义属性。你用@HotelCode的写法会被库判定为普通子元素名,因此生成了错误的<ota_2003_05: @HotelCode>标签。
三、具体解决方案
1. 修正XML属性的写法
将请求体中的属性用$字段包裹(soap库标准写法):
const inputBody = { // 根元素的属性 $: { EchoToken: "PartialWithParsing", Version: "6.001", PrimaryLangID: "en" }, HotelDescriptiveInfos: { HotelDescriptiveInfo: { // HotelDescriptiveInfo的属性 $: { HotelCode: 'RTNYCNOV' } } } };
2. 配置客户端使用默认命名空间
创建客户端时通过选项指定默认命名空间,避免生成前缀:
soap.createClient(filePath, { overrideRootElement: { namespace: 'http://www.opentravel.org/OTA/2003/05', xmlnsAttributes: [{ name: 'xmlns', value: 'http://www.opentravel.org/OTA/2003/05' }] } }, (err, client) => { if (err) { console.log(err); return; } client.Hotel_DescriptiveInfo(inputBody, {namespace: 'http://www.opentravel.org/OTA/2003/05'}, (err: any, data: any) => { if (err) { console.log("err ====", err) } console.log("data == ", data) }) });
3. 备选:手动修改命名空间前缀映射
如果上述配置无效,可在客户端创建后手动调整前缀映射,将目标命名空间的前缀设为空:
soap.createClient(filePath, (err, client) => { if (err) { console.log(err); return; } // 空前缀对应目标命名空间,消除显式前缀 client.wsdl.xmlnsInEnvelope = {'': 'http://www.opentravel.org/OTA/2003/05'}; client.Hotel_DescriptiveInfo(inputBody, (err: any, data: any) => { if (err) { console.log("err ====", err) } console.log("data == ", data) }) });
内容的提问来源于stack exchange,提问作者radhika thakkar
相关产品推荐
相关产品推荐

