1

Savon 固执地从 WSDL 生成 SOAP 信封。它做得不正确,我看不出有什么办法解决它。wsdl:无论出于何种原因,它还可以随意在所有内容上插入名称空间。

我正在构建的请求使用tns:命名空间。我希望能够使用 Savon::Model,但现在我必须这样做:

client.request :tns, :function_name do
  soap.body = { params }
end

而不是类似的东西:

super(params)

在每个函数中创建请求块很乏味,我必须每次都定义函数名称,而不是像理想情况下那样自动调用正确的函数。现在我的功能看起来像

def foo
  client.request :tns, :foo do
  ...
end

不得不说两次“foo”似乎很荒谬。有没有办法为扩展 Savon::Model 的类中的每个请求设置默认命名空间?

4

3 回答 3

1
client = Savon.client do
  wsdl "blah blah"
  element_form_default :qualified
  namespace_identifier :tem
  env_namespace :soapenv
end
于 2016-05-09T01:30:04.280 回答
0

我不确定我是否理解你的问题。我假设您正在询问如何设置默认命名空间并将请求正文包装在一个函数中,因此您不需要每次都编写请求正文。这段代码对我有用,但我删除了一些不相关的部分

class ExampleWS
  EXAMPLE_WS_DEFAULT_NAMESPACE = "urn:example:request:1.0.0"
  ......
  def getStockPrice( locale, stockId )
    response = $client.request :get_stock_price do
    soap.input = [
      "ns1:getStockPrice",
      {
        "xmlns:ns1" => EXAMPLE_WS_DEFAULT_NAMESPACE #set default namespace here
      }
    ]
    soap.body = {
      "locale" => locale,
      "stockId" => stockId
    }
    end
  end
  ......
end
......
# call the function
getStockPrice("en_US", 123 )
于 2012-11-05T21:38:03.683 回答
0

这对我有用。但它使用 Savon 2:

class Soapservice
  extend Savon::Model

  client wsdl: "http://example.com?wsdl", env_namespace: :tns, 

  operations :get_resource, :put_resource

  def :get_resource(id)
    super(message: { id: id })
  end
end

service = Soapservice.new
response = service.get_resource(1) #overwriting get_resource
# or
response = service.put_resource(message: { username: "luke", secret: "secret" })

(我的示例建立在官方savon 主页的示例之上)

于 2013-01-21T11:55:45.373 回答