使用Savon调用GlobalWeather SOAP接口时参数未传入报错
解决Savon调用SOAP服务时参数未传入的问题
我之前也碰到过类似的情况,你的问题核心是没有正确应用convert_request_keys_to配置,而且代码里还存在变量名冲突的问题,导致参数没有被正确传递到SOAP请求中。
问题分析
你在index方法里尝试重新定义client的写法是错误的:
client = client do convert_request_keys_to :none end
这里的client是你已经定义的方法名,重新赋值会覆盖原有引用,而且Savon的配置block必须在Savon.client初始化时使用,不能在已有的客户端实例上修改配置。这就导致你的convert_request_keys_to :none配置根本没有生效,参数名还是被自动转换,最终服务端没有接收到CountryName参数。
正确解决方案
有两种方式可以修复这个问题:
方式1:全局配置客户端
在初始化Savon客户端时直接添加convert_request_keys_to配置,这样所有调用都会生效:
class CitiesController < ApplicationController def index @operations = client.operations @response = client.call(:get_cities_by_country, message: { CountryName: "Spain" }) end def client Savon.client( wsdl: 'http://www.webservicex.net/globalweather.asmx?WSDL', convert_request_keys_to: :none # 直接在初始化时配置 ) end end
方式2:单次调用时指定配置
如果不想全局修改配置,可以在每次call方法中单独指定参数转换规则:
class CitiesController < ApplicationController def index @operations = client.operations @response = client.call( :get_cities_by_country, message: { CountryName: "Spain" }, convert_request_keys_to: :none # 仅本次调用生效 ) end def client Savon.client(wsdl: 'http://www.webservicex.net/globalweather.asmx?WSDL') end end
补充说明
这个SOAP服务的GetCitiesByCountry方法对参数名的大小写是严格要求的,必须保持CountryName的驼峰写法。只要确保参数名没有被自动转换(通过convert_request_keys_to :none),服务端就能正确接收到@CountryName参数,不会再抛出缺失参数的错误。
内容的提问来源于stack exchange,提问作者Ernesto G
相关产品推荐
相关产品推荐

