Ruby Soap通信にSavonを使用するときに、「WSDL」名前空間がアクション名に挿入されるのはなぜですか?

StackOverflow https://stackoverflow.com/questions/2294325

  •  21-09-2019
  •  | 
  •  

質問

私は制御しない石鹸サービスにアクセスしようとしています。アクションの1つが呼び出されます ProcessMessage. 。私はこの例に従って石鹸のリクエストを生成しましたが、アクションが存在しないというエラーが戻ってきました。封筒の本体の生成方法まで問題を追跡しました。

<env:Envelope ... ">
    <env:Header>
        <wsse:Security ... ">
            <wsse:UsernameToken ...">
                <wsse:Username>USER</wsse:Username>
                    <wsse:Nonce>658e702d5feff1777a6c741847239eb5d6d86e48</wsse:Nonce>
                    <wsu:Created>2010-02-18T02:05:25Z</wsu:Created>
                    <wsse:Password ... >password</wsse:Password>
            </wsse:UsernameToken>
        </wsse:Security>
    </env:Header>
    <env:Body>
        <wsdl:ProcessMessage>
            <payload>
                ......
            </payload>
        </wsdl:ProcessMessage>
    </env:Body>
</env:Envelope>     

それか ProcessMessage タグは次のとおりです。

    <ProcessMessage xmlns="http://www.starstandards.org/webservices/2005/10/transport">

それは、サンプルJavaアプリによって生成されたときであり、機能します。そのタグは、Rubyアプリが生成するものとサンプルJavaアプリの唯一の違いです。を取り除く方法はありますか "wsdl:" その1つのタグの前にある名前空間とそのような属性を追加します。それを除いて、身体の残りの部分のような文字列として渡されただけで、アクションを生成しないように強制する方法はありますか?

これが私のコードです:

require 'rubygems'
require 'savon'
client = Savon::Client.new "https://gmservices.pp.gm.com/ProcessMessage?wsdl"

response = client.process_message! do | soap, wsse |
wsse.username = "USER"
wsse.password = "password"
soap.namespace = "http://www.starstandards.org/webservices/2005/10/transport" #makes no difference
soap.action = "ProcessMessage" #makes no difference
soap.input = "ProcessMessage" #makes no difference

#my body at this point is jsut one big xml string

soap.body = "<payload>...</payload>" 
# putting <ProccessMessage> tag here doesn't help as it just creates a duplicate tag in the body, since Savon keeps interjecting  <wsdl:ProcessMessage> tag.

  end

私はハンドソープを試しましたが、それはHTTPSをサポートせず、混乱しています。 SOAP4Rを試しましたが、ハンドソープよりもさらに混乱しています。

役に立ちましたか?

解決 3

スティーブ、あなたはそのWSDL:ProcessMessageタグの前にわかりますか? - 私はそれが私を投げ捨てていた唯一のことだと思ったが、そうではない(ちなみに、160行目のSapon Libのsoap.rbでは難しいセットである)。 Soap.NamesSpacesで隔離しなくても、最終XMLで生成され、接続されているのは難しいです。私のサービスでは許可されていません。

生成されたXMLは有効なXMLですが、私が話しようとしているサービスの要件によっては完全ではありません。 IE:生成されたXMLで、

<?xml version="1.0" encoding="UTF-8"?>

タグがありません。また、ヘッダーにPayloadManifestが必要です。さらに、WSU:作成とWSU:WSSEで有効期限を取る必要があります:タグですが、実装されていません。私の場合。ただし、SOAPにはプライベートメソッド= xml_bodyがあります。また、TO_XMLメソッドのSOAP LIBは、独自のXMLを生成する前に、@xml_bodyがすでに設定されているかどうかを確認しています。それで、私は石鹸の挙動をスリーに変更することになりました。 soap.xml_body =公開可能にすることにより。だから私はできました:

response = client.process_message! do |soap| 
soap.action = "http://www.starstandards.org/webservices/2005/10/transport/operations/ProcessMessage"
soap.xml_body = "MY XML STRING GENERATED ELSEWHERE GOES HERE"
end

最終的に機能します!!!!

これをRubiiに提案します - このオプションが利用可能になった場合、多くのまれなケースを解決する - 人々はカスタムXMLを生成し、Savon Libの残りの部分を使用できます。

他のヒント

SOAPに配列を渡す必要があります。その2番目の要素は、名前空間の詳細を含むハッシュです。

soap.input = [ 
  "ProcessMessage", 
  {"xmlns" => "http://www.starstandards.org/webservices/2005/10/transport"}
]

これにより、メイン要素への属性としてスペース宣言という名前になることが保証されます。

あなたはおそらく、そのような要素の前に名前空間宣言になります

<env:Body>
    <wsdl:ProcessMessage xmlns="........." >
        <payload>
            ......
        </payload>
    </wsdl:ProcessMessage>
</env:Body>

しかし、これは私にとって問題ではありませんでした。それは、要素の前の名前空間の存在ではなく、問題である名前空間属性の欠如でした。

私のウェブサービスのために私は "wsdl" スティーブのソリューションの上にある名前空間。

Savon 0.9.6でテスト:

client = Savon::Client.new "https://example.com/webservice/account.asmx?WSDL"
response = client.request "GetAccount" do
  # Gotcha 1: set default namespace for body elements
  soap.input = ["GetAccount", {"xmlns" => "https://example.com/webservice/"}]
  soap.body = {
    "AccountID" => 1234
  }
  # Gotcha 2: get rid of namespace declaration of body elements
  soap.element_form_default = :unqualified
  # Gotcha 3: set SOAPAction different from default
  http.headers["SOAPAction"] = '"https://example.com/webservice/GetAccount"'
end
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top