有没有办法用Savon :: Model设置默认命名空间?

时间:2012-10-17 20:51:35

标签: ruby-on-rails soap savon

Savon在从WSDL生成SOAP信封方面很顽固。它做得不正确,我认为无法修复它。无论出于何种原因,它还可以自由地在所有内容上插入wsdl:命名空间。

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

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

而不是像:

super(params)

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

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

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

3 个答案:

答案 0 :(得分: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 )

答案 1 :(得分: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 homepage上的那个)

答案 2 :(得分:0)

client = Savon.client do
  wsdl "blah blah"
  element_form_default :qualified
  namespace_identifier :tem
  env_namespace :soapenv
end