使用Savon Ruby Gem发起请求时遇Savon::SOAPFault错误求助
解决Savon调用SOAP接口出现的
Trying to declare prefix 'xmlns'错误 这个错误源于XML命名空间规范的限制——xmlns是XML中专门用于声明命名空间的保留关键字,不能被当作元素前缀使用。服务端的Wstx XML解析器检测到请求中存在非法的xmlns:前缀声明,因此抛出了SOAP Fault。
虽然你没有手动声明任何前缀,但Savon在自动生成SOAP请求时,可能因为WSDL的问题、自身版本的命名空间处理bug,导致生成了不符合规范的XML内容。
以下是具体的解决方案:
查看实际发送的SOAP请求
开启Savon的日志功能,检查生成的XML是否存在非法的xmlns:前缀:client = Savon.client( wsdl: wsdl_url, follow_redirects: true, log: true, log_level: :debug, pretty_print_xml: true )执行请求后,在日志中找到完整的SOAP请求XML,确认是否出现类似
<xmlns:fecha>这种格式的非法元素。检查并修复WSDL文件
下载目标WSDL文件,用XML验证工具检查是否存在命名空间定义错误。如果WSDL本身存在语法问题,会导致Savon生成错误的请求格式。手动指定命名空间
尝试在Savon客户端配置或调用时明确指定目标命名空间,避免自动生成逻辑出错:# 客户端全局配置命名空间 client = Savon.client( wsdl: wsdl_url, follow_redirects: true, namespace: "http://your-service-namespace.com" # 替换为WSDL中的实际命名空间 ) # 或者调用时单独指定 response = client.call( :obtener_cotizacion, message: { fecha: '2022-08-02' }, namespace: "http://your-service-namespace.com" )升级Savon版本
你当前使用的是Savon 2.13.0,该版本可能存在命名空间处理的已知bug。尝试升级到最新的2.x版本:bundle update savon升级后重新测试请求。
手动构造SOAP XML(临时方案)
如果上述方法都无效,直接手动构造符合规范的SOAP消息发送:soap_xml = <<~XML <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cot="http://your-service-namespace.com"> <soapenv:Header/> <soapenv:Body> <cot:obtener_cotizacion> <cot:fecha>2022-08-02</cot:fecha> </cot:obtener_cotizacion> </soapenv:Body> </soapenv:Envelope> XML response = client.call(:obtener_cotizacion, xml: soap_xml)注意将
http://your-service-namespace.com和cot前缀替换为WSDL中的实际值。
内容的提问来源于stack exchange,提问作者alebian
相关产品推荐
相关产品推荐

