2016-10-21 4 views
3

が再書き込みサボンボディの名前空間によって書かしようとしています無視 - ins0 私はこのクライアント変数があります。サボンはnamespace_identifier属性

client = Savon.client(wsdl: "https://integcert.synxis.com/interface/Contracts/ChannelConnect2004.wsdl", log_level: :debug, log: true, pretty_print_xml: true, env_namespace: :soapenv, namespaces: {"xmlns:soapenv": "http://schemas.xmlsoap.org/soap/envelope/", "xmlns:head": "http://htng.org/1.1/Header/","xmlns:ns": "http://www.opentravel.org/OTA/2003/05"}, convert_request_keys_to: :none, namespace_identifier: "ns", element_form_default: :qualified) 

とAMは要求をやって:

client.call(:ping, soap_header: { "head:HTNGHeader": { "head:From": { "head:Credential": { "head:userName": "******", "head:password":"*****" }}}}, message: {"ns:EchoData": "TestData"}) 

を私は」 veはこの石鹸rq体を持っています:

<soapenv:Body> 
    <ins0:OTA_PingRQ> 
     <ns:EchoData>TestData</ns:EchoData> 
    </ins0:OTA_PingRQ> 
    </soapenv:Body> 

ここでこのins0から来ていますか?

はまた、私はnamespace_identifier: nilパラメータでクライアントを定義しようとしましたし、要求のこの種のやったとき:私はこの石鹸RQ本体を持って

client.call(:ping, soap_header: { "head:HTNGHeader": { "head:From": { "head:Credential": { "head:userName": "******", "head:password":"*****" }}}}, message: {"ns:OTA_PingRQ": {"ns:EchoData": "TestData"}}) 

<soapenv:Body> 
<OTA_PingRQ> 
    <ns:OTA_PingRQ> 
    <ns:EchoData>TestData</ns:EchoData> 
    </ns:OTA_PingRQ> 
</OTA_PingRQ> 

そして、私が持っている正しい体は:

<soapenv:Body> 
    <ns:OTA_PingRQ> 
    <ns:EchoData>TestData</ns:EchoData> 
    </ns:OTA_PingRQ> 
</soapenv:Body> 

追加のネストされたOTA_PingRQノードを削除する方法、またはins0名前空間をカスタムで置き換える方法はありますか?

+0

SOAP:envelopeを含む完全なXMLを投稿してください。名前空間接頭辞ins0はSOAPエンベロープで宣言されている必要があります。 ins0、nsが両方とも "http://www.opentravel.org/OTA/2003/05"と定義されている場合、要求は有効です。 SOAP UIを使用して、生成されたSOAPリクエストを検証してテストすることをお勧めします。 – sashwat

答えて

0

名前空間を追加しても理にかなっていますが、Savonは実際にどこにでも使いたいとは思えません。 WSDLにある名前空間を使用する方が好きです。私はelement_form_default: :qualifiedelement_form_default: :unqualifiedを試しましたが、毎回OTA_PingRQノードの名前空間としてins0を置きます。私はそれがins0を使用しようとしたらins0と思った。 利用可能なネームスペースのリストを見て、適切なネームスペースも見つけました。なぜSavonがヘッダーノードの名前空間を自動的に指定したくないのかわからないので、手動でins1と指定する必要があります。

ここでの設定の作業バージョンです:

client = Savon.client(
    wsdl: "https://integcert.synxis.com/interface/Contracts/ChannelConnect2004.wsdl", 
    log_level: :debug, 
    log: true, 
    pretty_print_xml: true, 
    namespace_identifier: :ins0, 
    element_form_default: :qualified, 
    soap_header: { 
    "ins1:HTNGHeader": { 
     "ins1:From": { 
     "ins1:Credential": { 
      "ins1:userName": "******", 
      "ins1:password":"*****" 
     } 
     } 
    } 
    } 
) 

client.call(:ping, message: {"EchoData": "TestData"}) 

要求:

<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ins0="http://www.opentravel.org/OTA/2003/05" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ins1="http://htng.org/1.1/Header/"> 
    <env:Header> 
    <ins1:HTNGHeader> 
     <ins1:From> 
     <ins1:Credential> 
      <ins1:userName>******</ins1:userName> 
      <ins1:password>*****</ins1:password> 
     </ins1:Credential> 
     </ins1:From> 
    </ins1:HTNGHeader> 
    </env:Header> 
    <env:Body> 
    <ins0:OTA_PingRQ> 
     <ins0:echoData>TestData</ins0:echoData> 
    </ins0:OTA_PingRQ> 
    </env:Body> 
</env:Envelope> 

応答:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <OTA_PingRS xmlns="http://www.opentravel.org/OTA/2003/05" PrimaryLangID="en"> 
     <Errors> 
     <Error Type="4" ShortText="Login failed"/> 
     </Errors> 
     <EchoData/> 
    </OTA_PingRS> 
    </soap:Body> 
</soap:Envelope> 

EDIT:それは、より効率的な方法だから、クライアント構成でsoap_headerを提供は、 。