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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:14:41