1

使用しているソープ サービスの 1 つに問題があります。soap4rソープサービスを利用しています。しかしどういうわけか、彼らは私が送っているもの以外の何かを期待しています. これは私が送っているものです:

<?xml version="1.0" encoding="utf-8" ?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <env:Header>
        <authenticate env:mustUnderstand="0">
          <username>USERNAME</username>
          <apiKey>API_KEY</apiKey>
        </authenticate>
        <SoftLayer_Network_Media_Transcode_AccountInitParameters env:mustUnderstand="0">
          <id>ID</id>
        </SoftLayer_Network_Media_Transcode_AccountInitParameters>
        <SoftLayer_Network_Media_Transcode_AccountObjectFilter env:mustUnderstand="0">
          <transcodeJobs>
            <transcodeStatus>
              <name>
                <operation>Complete</operation>
              </name>
            </transcodeStatus>
          </transcodeJobs>
        </SoftLayer_Network_Media_Transcode_AccountObjectFilter>
  </env:Header>
  <env:Body>
    <n1:getTranscodeJobs xmlns:n1="http://api.service.softlayer.com/soap/v3/"
        env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    </n1:getTranscodeJobs>
  </env:Body>
</env:Envelope>
目的の出力が返されません。彼らが期待していることは次のとおりです。
<?xml version="1.0" encoding="utf-8" ?>
<env:封筒 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:n1="http://api.service.softlayer.com/soap/v3/"
        env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <env:ヘッダー>
        <authenticate env:mustUnderstand="0">
          <username>USER_NAME</username>
          <apiKey>API_KEY</apiKey>
        </認証>
        <SoftLayer_Network_Media_Transcode_AccountInitParameters env:mustUnderstand="0">
          <id>ID</id>
        </SoftLayer_Network_Media_Transcode_AccountInitParameters>
        <n1:SoftLayer_Network_Media_Transcode_AccountObjectFilter env:mustUnderstand="0">
          <トランスコードジョブ>
            <トランスコードステータス>
              <名前>
                <操作>完了</操作>
              </名前>
            </トランスコードステータス>
          </transcodeJobs>
        </n1:SoftLayer_Network_Media_Transcode_AccountObjectFilter>
  </env:ヘッダー>
  <env:本体>
    <n1:getTranscodeJobs >
    </n1:getTranscodeJobs>
  </env:本文>
</env:封筒>
ルートの名前空間とエンコーディング スタイル (ヘッダー ObjectFilter で使用しているため)。soap4r は前のリクエストを生成していますが、実際に機能する後のリクエストに変更することはできません。

これが私がsoap4rを使用している方法です:

class SLHeader < SOAP::Header::SimpleHandler
  def initialize(tag, out)
    @out = out
    super(XSD::QName.new(nil, tag))
  end
  def on_simple_outbound
    @out
  end
end
SOAP_WSDL_ENDPOINT = "endpoint"
service = "service name"
initParams = {'id' => ID}
objectFilter = {'transcodeJobs' => {'transcodeStatus' => {'name' => {'operation' => STATUS}}}}
driver = SOAP::WSDLDriverFactory.new(SOAP_WSDL_ENDPOINT + service + "?wsdl").create_rpc_driver
driver.headerhandler << SLHeader.new('authenticate', {'username' => @auth_user, 'apiKey' => @auth_key})
driver.headerhandler << SLHeader.new(service + 'InitParameters', initParam)
driver.headerhandler << SLHeader.new(service + 'ObjectFilter', objectFilter)

4

1 に答える 1

2

であまり時間を無駄にしないことを強くsoap4rお勧めします。

それが機能する場合、それは素晴らしいことです。しかし、SOAP サービスに特定の期待がある場合や、何らかの形で壊れている場合、それはまったく役に立ちません (そして、大量のモンキー パッチを適用しないと修正することは不可能です)。ライブラリの内部状態もかなり悪く、Ruby 1.9では動かない。

SOAP インターフェースについてはhandsoap、私が使い始めた . もう少し手間がかかりますが、あなたと同じような多くの頭痛から解放されました。Ruby 1.9 でも動作します。私は振り返っていません。

于 2010-03-01T10:29:18.630 に答える