2017-07-07 36 views
5

Savon.rbを使用したレールプロジェクトでは、非常に複雑なSOAP呼び出しをしようとしています。少なくともSavonのビルダーがそれほど複雑ではないので、私は:xmlを直接操作することに決めました。Savonを使ったRuby on RailsのSOAP呼び出しは、エンベロープとメインオペレーションの周りで奇妙になる

私の最初にクライアントを開始:

@client = Savon.client(
      :endpoint => 'https://testservice.postnl.com/CIF_SB/BarcodeWebService/1_1/BarcodeWebService.svc', 
      :wsdl  => 'https://testservice.postnl.com/CIF_SB/BarcodeWebService/1_1/?wsdl') 

それから私はの形で電話をかける:

@request = @client.build_request(:generate_barcode, 
      xml: %Q{ ... see soap call (with ruby interpolation) ... } 

私が正しくフォーマットl Time.now, format: :postnl_api文字列を追加し、残りはまだハードコーディングされています。メッセージ番号を含む。

このケースでは、@request.bodyを使用して取得されたように、実際にSavonによってコールが行われた方法を次に示します。私のアプリケーションで

SOAPコール

<?xml version="1.0" encoding="UTF-8"?> 
<s:Envelope 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:wsdl="http://tempuri.org/" 
    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header> 
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://postnl.nl/cif/services/BarcodeWebService/IBarcodeWebService/GenerateBarcode 
    </Action> 
    <Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
     <UsernameToken> 
     <Username>devc_!R4xc8p9</Username> 
     <Password>xxxxxxxx</Password> 
     </UsernameToken> 
    </Security> 
    </s:Header> 
    <s:Body> 
    <wsdl:GenerateBarcode> 
     <d6p1:Customer> 
     <d6p1:CustomerCode>DEVC</d6p1:CustomerCode> 
     <d6p1:CustomerNumber>11223344</d6p1:CustomerNumber> 
     </d6p1:Customer> 
     <d6p1:Barcode> 
     <d6p1:Type>3S</d6p1:Type> 
     <d6p1:Range>DEVC</d6p1:Range> 
     <d6p1:Serie>1000000-2000000</d6p1:Serie> 
     </d6p1:Barcode> 
    </wsdl:GenerateBarcode> 
    </s:Body> 
</s:Envelope> 

続いて、次は私が会社のサンドボックス環境での成功を持つ、このいずれかを見てきたよう呼び出しがどのように見えるべきかです。

SOAP呼び出し、それが

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header> 
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://postnl.nl/cif/services/BarcodeWebService/IBarcodeWebService/GenerateBarcode</Action> 
    <Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
     <wsse:UsernameToken xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
     <wsse:Username>devc_!R4xc8p9</wsse:Username> 
     <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">xxxxxxxx</wsse:Password> 
     </wsse:UsernameToken> 
    </Security> 
    </s:Header> 
    <s:Body> 
    <GenerateBarcode xmlns:d6p1="http://postnl.nl/cif/domain/BarcodeWebService/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://postnl.nl/cif/services/BarcodeWebService/"> 
     <d6p1:Message> 
     <d6p1:MessageID>5</d6p1:MessageID> 
     <d6p1:MessageTimeStamp>28-06-2017 14:15:41</d6p1:MessageTimeStamp> 
     </d6p1:Message> 
     <d6p1:Customer> 
     <d6p1:CustomerCode>DEVC</d6p1:CustomerCode> 
     <d6p1:CustomerNumber>11223344</d6p1:CustomerNumber> 
     </d6p1:Customer> 
     <d6p1:Barcode> 
     <d6p1:Type>3S</d6p1:Type> 
     <d6p1:Range>DEVC</d6p1:Range> 
     <d6p1:Serie>1000000-2000000</d6p1:Serie> 
     </d6p1:Barcode> 
    </GenerateBarcode> 
    </s:Body> 
</s:Envelope> 

あるべきなオフのようです主なものは、(これはところでサボンビルダーを使用してもそうであった)envelopeの属性やメインですオペレーションの:generate_barcodeの形状とその属性を示します。私はGenerateBarcodeの前になぜプレフィックスwsdl:が得られるのか分からない。

私はサボンに私のXMLをとり、それを正確に構築するよう伝えますが、動作しません。そのままのバージョンを送信するとエラー400が返されます。クリス彼の部分を使用して

EDITは、私は、次の呼び出しを行うことができた彼の答えを@クリスを使用して

は:

は、コール

@client = Savon.client(
       :endpoint    => 'https://testservice.postnl.com/CIF_SB/BarcodeWebService/1_1/BarcodeWebService.svc', 
       :wsdl     => 'https://testservice.postnl.com/CIF_SB/BarcodeWebService/1_1/?wsdl', 
       :log      => true, 
       :wsse_auth    => [ENV['postnl_username'], ENV['postnl_password']], 
       :pretty_print_xml  => true, 
       :convert_request_keys_to => :camelcase, 
       :env_namespace   => :s) 

    message = { 
        "d6p1:Message" => { 
        "d6p1:MessageID" => "7", 
        "d6p1:MessageTimeStamp" => I18n.l(Time.now, format: :postnl_api) 
       }, 
        "d6p1:Customer" => { 
        "d6p1:CustomerCode" => "DEVC", 
        "d6p1:CustomerNumber" => "11223344"}, 
        "d6p1:Barcode" => { 
         "d6p1:Type" => "3S", 
         "d6p1:Range" => "DEVC", 
         "d6p1:Serie" => "1000000-2000000" } 
       } 
    @client.call(:generate_barcode, :message => message, :soap_header => { "Action" => "http://postnl.nl/cif/services/BarcodeWebService/IBarcodeWebService/GenerateBarcode"}) 

コール

を設定します
<?xml version="1.0" encoding="UTF-8"?> 
<s:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsdl="http://tempuri.org/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header> 
    <Action>http://postnl.nl/cif/services/BarcodeWebService/IBarcodeWebService/GenerateBarcode</Action> 
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
     <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken-1"> 
     <wsse:Username>devc_!R4xc8p9</wsse:Username> 
     <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">098fd559930983af31ef6630a0bb0c1974156561</wsse:Password> 
     </wsse:UsernameToken> 
    </wsse:Security> 
    </s:Header> 
    <s:Body> 
    <wsdl:GenerateBarcode> 
     <d6p1:Message> 
     <d6p1:MessageID>7</d6p1:MessageID> 
     <d6p1:MessageTimeStamp>17-07-2017 22:13:35</d6p1:MessageTimeStamp> 
     </d6p1:Message> 
     <d6p1:Customer> 
     <d6p1:CustomerCode>DEVC</d6p1:CustomerCode> 
     <d6p1:CustomerNumber>11223344</d6p1:CustomerNumber> 
     </d6p1:Customer> 
     <d6p1:Barcode> 
     <d6p1:Type>3S</d6p1:Type> 
     <d6p1:Range>DEVC</d6p1:Range> 
     <d6p1:Serie>1000000-2000000</d6p1:Serie> 
     </d6p1:Barcode> 
    </wsdl:GenerateBarcode> 
    </s:Body> 
</s:Envelope> 

応答

<?xml version="1.0"?> 
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
    <s:Fault> 
     <faultcode xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:InternalServiceFault</faultcode> 
     <faultstring xml:lang="en-US">The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the &lt;serviceDebug&gt; configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework SDK documentation and inspect the server trace logs.</faultstring> 
    </s:Fault> 
    </s:Body> 
</s:Envelope> 
+0

サボーンのバージョンを使用していますか? – Chris

+0

バージョン2、すでに3をお勧めしますか? –

答えて

1

[OK]を、この作品(検証)

@client = Savon.client(
      :wsdl     => 'https://testservice.postnl.com/CIF_SB/BarcodeWebService/1_1/?wsdl', 
      :log      => true, 
      :wsse_auth    => ['devc_!R4xc8p9', 'xxx'], 
      :pretty_print_xml  => true, 
      :convert_request_keys_to => :camelcase, 
      :env_namespace   => :s, 
      :namespace_identifier => nil 
      ) 

message = { 
       "d6p1:Message" => { 
       "d6p1:MessageID" => "10", 
       "d6p1:MessageTimeStamp" => Time.now.strftime("%d-%m-%Y %H:%M:%S") 
      }, 
       "d6p1:Customer" => { 
       "d6p1:CustomerCode" => "DEVC", 
       "d6p1:CustomerNumber" => "11223344"}, 
       "d6p1:Barcode" => { 
        "d6p1:Type" => "3S", 
        "d6p1:Range" => "DEVC", 
        "d6p1:Serie" => "1000000-2000000" } 
      } 


attributes = { "xmlns:d6p1" => "http://postnl.nl/cif/domain/BarcodeWebService/", 
       "xmlns:i" => "http://www.w3.org/2001/XMLSchema-instance", 
       "xmlns" => "http://postnl.nl/cif/services/BarcodeWebService/"} 

@client.call(:generate_barcode, :attributes => attributes, 
      :message => message, 
      :soap_header => { "Action" => "http://postnl.nl/cif/services/BarcodeWebService/IBarcodeWebService/GenerateBarcode"}) 

だから、トリックが:namespace_identifier => nilを追加し、attributesを送っていました。 namespace_identifierを設定するとGenerateBarcodeからwsdlが削除されます。ans属性はGenerateBarcodeタグにいくつかの名前空間を設定します。私はなぜSOAPをそんなに嫌うのか覚えています。(

+0

私の問題を調べる努力をしてくれてありがとうございます。私のサンドボックスのパスワードハッシュは '098fd559930983af31ef6630a0bb0c1974156561'です。不具合がまだどこにあるのかわかりません –

+0

Okは私の答えを更新しました。このコードは私にとって役に立ちます! – Chris

+0

残念ながら、賞金は失効しました。何らかの理由で、100を選択できるようになりました...申し訳ありませんがとにかく、期限切れです。 –

関連する問題