私が制御していない SOAP サービスにアクセスしようとしています。アクションの 1 つが呼び出されProcessMessage
ます。例に従って SOAP リクエストを生成しましたが、アクションが存在しないというエラーが返されました。エンベロープの本体の生成方法に問題があることを突き止めました。
<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 アプリの違いは、そのタグだけです。その1つのタグの前にある名前空間を取り除き、その"wsdl:"
ような属性を追加する方法はありますか. それを除けば、体の残りの部分のように文字列として渡されるだけでアクションが生成されないようにする方法はありますか?
これが私のコードです:
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
handsoap を試してみましたが、HTTPS をサポートしておらず、混乱しています。私はsoap4rを試しましたが、ハンドソープよりもさらに混乱しています。