升级Savon至2.15.1后调用Workday SOAP API出现命名空间错误
问题:Savon升级后调用Workday SOAP API出现命名空间错误
错误详情
(SOAP-ENV:Client.validationError) Validation error occurred. Namespace not found: urn:com.workday/bsvc/Revenue_Management
问题原因
将Savon从2.12.1升级至2.15.1后,Savon在PR#943中修改了WSDL命名空间的处理逻辑,现在会自动添加WSDL中的所有命名空间。但Workday SOAP API仅需使用xmlns:wsdl="urn:com.workday/bsvc"这一个命名空间即可正常交互。
当前可选方案
- 弃用Savon,改用Rails原生工具构建HTTP请求体模板并注入数据
- 回退至Savon 2.12.1,但该版本发布于2020年,长期使用存在安全风险,且与后续Ruby版本升级计划冲突
保留Savon的解决方案
可以通过以下配置让Savon仅使用指定的命名空间,避免自动注入多余的WSDL命名空间:
1. 手动指定客户端命名空间
在创建Savon客户端时,直接指定所需的命名空间,覆盖WSDL自动加载的命名空间:
client = Savon.client( wsdl: "你的Workday WSDL地址", namespace: "urn:com.workday/bsvc", # 补充其他必要配置:如认证信息、端点地址等 )
2. 禁用自动命名空间注入,手动构建请求
如果上述方法无法解决问题,可以关闭Savon的自动命名空间处理,手动在请求中定义所需的命名空间:
response = client.call(:目标操作名称, message: { "wsdl:请求字段名" => "字段值" }, namespaces: { "wsdl" => "urn:com.workday/bsvc" }, strip_namespaces: true # 禁用自动从WSDL加载命名空间 )
此外,若需要自定义SOAP头,也可以通过soap_header参数手动设置头信息的命名空间,确保仅包含必要的命名空间声明。
内容的提问来源于stack exchange,提问作者Matthew Caughman
相关产品推荐
相关产品推荐

