1

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」を 2 回言わなければならないのはばかげているように思えます。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

これは私にとってはうまくいきます。ただし、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" })

(私の例は、サボンの公式ホームページのものに基づいています)

于 2013-01-21T11:55:45.373 に答える
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 に答える