You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:39:25