2017-05-12 13 views
1

私の会社では、非常に具体的なヘッダーと書式設定要件を使用する多くの内部APIを使用しています。私はSOAP :: Liteの新機能です。私はそれを会社のフレームワーク内で動作させようとしています。非常に具体的なSOAP :: Liteリクエストを送信

てみてください#1:理想的 、私は、(ポストの一番下を参照)、生のXMLテンプレートを取り、いくつかのプレースホルダ変数を移入し、次のコードを使用してエンドポイントに送信できるようにしたいと思います。

my $client = SOAP::Lite->new(proxy => "$serviceURL"); 
my $reply = $client->InquireEnterpriseOrderDataRequest($rawxml); 

しかし、これは私のヘッダをもたらし、要求セクションは、サービスによって拒否され、それ自身の「封筒」、「ボディ」と「InquireEnterpriseOrderDataRequest」で囲まれています。

は#2を試してみてください: 私が試した次のものが二つに私の要求を破ることだった:ヘッダーと要求し、それらを送信するためにSOAP::DataSOAP::Headerを使用します。

my $rawxmlheader = '<ns2:MessageHeader xmlns:ns2="http://mycompany.com/MessageHeader.xsd" xmlns="http://mycompany.com/CingularDataModel.xsd"> 
<ns2:TrackingMessageHeader> 
    <version>111</version> 
    <originalVersion/> 
    <messageId/> 
    <originatorId>ABC</originatorId> 
    <responseTo/> 
    <returnURL/> 
    <timeToLive>360000</timeToLive> 
    <conversationId>9AF0E9281A524262980F5284F4C57888_CCE423E277C74FA9A84D2155CD612EB3_0</conversationId> 
    <routingRegionOverride/> 
    <dateTimeStamp>2017-05-12T12:47:53Z</dateTimeStamp> 
    <uniqueTransactionId>mytransid</uniqueTransactionId> 
</ns2:TrackingMessageHeader> 
<ns2:SecurityMessageHeader> 
    <userName>myusername</userName> 
    <userPassword>mypass</userPassword> 
</ns2:SecurityMessageHeader> 
<ns2:SequenceMessageHeader> 
    <sequenceNumber/> 
    <totalInSequence/> 
</ns2:SequenceMessageHeader> 
</ns2:MessageHeader>'; 

my $rawxmlrequest = '<OrderSearchCriteria> 
    <OrderDetails> 
     <SearchByOrderAction> 
     <orderActionNumber>12345654</orderActionNumber> 
     <orderActionVersion>1</orderActionVersion> 
     </SearchByOrderAction> 
    </OrderDetails> 
</OrderSearchCriteria> 
<provisioningDetailsIndicator>true</provisioningDetailsIndicator>'; 

    my $client = SOAP::Lite->new(proxy => "$serviceURL"); 
    my $header = SOAP::Header->type('xml' => $rawxmlheader); 
    my $elem = SOAP::Data->type('xml' => $rawxmlrequest); 
    my @arguments; 
    push(@arguments, $header); 
    push(@arguments, $elem); 
    my $reply = $client->InquireEnterpriseOrderDataRequest(@arguments); 

これは非常によく似た要求を生成しましたInquireEnterpriseOrderDataRequest BLOBに、必要と思われるxsi:schemaLocation、xmlns、またはxmlns:xsiの値が含まれていなかったことを除いて、

てみてください#3:今 私はストローで把握されたので、私もきめ細かく、このようなものを使用して独自のXMLを作成しようとしました:

my $temp_elements = 
     SOAP::Data->name("OrderSearchCriteria" => \SOAP::Data->value(
     SOAP::Data->name("OrderDetails" => \SOAP::Data->value(
     SOAP::Data->name("SearchByOrderAction" => \SOAP::Data->value(
     SOAP::Data->name("orderActionNumber" => '301496944'), 
     SOAP::Data->name("orderActionVersion" => '3') 
     ) 
     ) 
    ) 
    )) 
     )->type("SomeObject"); 

my $client = SOAP::Lite->new(proxy => "$serviceURL"); 
my $reply = $client->InquireEnterpriseOrderDataRequest($temp_elements); 

ここでの問題は、私にはわからないということでしたxsi:schemaLocation、xmlns、およびxmlns:xsiの値を含める方法、またはヘッダー情報を付加する方法について説明します。

もちろん、私は可能な限りシンプルな実装にしたいと思いますが、どんな提案も感謝しています!前もって感謝します!

必須の要求フォーマット:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header> 
     <ns2:MessageHeader xmlns:ns2="http://mycompany.com/MessageHeader.xsd" xmlns="http://mycompany.com/CingularDataModel.xsd"> 
     <ns2:TrackingMessageHeader> 
      <version>111</version> 
      <originalVersion/> 
      <messageId/> 
      <originatorId>ABC</originatorId> 
      <responseTo/> 
      <returnURL/> 
      <timeToLive>360000</timeToLive> 
      <conversationId>9AF0E9281A524262980F5284F4C57888_CCE423E277C74FA9A84D2155CD612EB3_0</conversationId> 
      <routingRegionOverride/> 
      <dateTimeStamp>2017-04-11T18:47:53Z</dateTimeStamp> 
      <uniqueTransactionId>mytransid</uniqueTransactionId> 
     </ns2:TrackingMessageHeader> 
     <ns2:SecurityMessageHeader> 
      <userName>myusername</userName> 
      <userPassword>mypass</userPassword> 
     </ns2:SecurityMessageHeader> 
     <ns2:SequenceMessageHeader> 
      <sequenceNumber/> 
      <totalInSequence/> 
     </ns2:SequenceMessageHeader> 
     </ns2:MessageHeader> 
    </SOAP-ENV:Header> 
    <SOAP-ENV:Body> 
     <InquireEnterpriseOrderDataRequest xsi:schemaLocation="http://mycompany.com/InquireEnterpriseOrderDataRequest.xsd" xmlns="http://mycompany.com/InquireEnterpriseOrderDataRequest.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <OrderSearchCriteria> 
      <OrderDetails> 
       <SearchByOrderAction> 
        <orderActionNumber>12345654</orderActionNumber> 
        <orderActionVersion>1</orderActionVersion> 
       </SearchByOrderAction> 
      </OrderDetails> 
     </OrderSearchCriteria> 
     <provisioningDetailsIndicator>true</provisioningDetailsIndicator> 
     </InquireEnterpriseOrderDataRequest> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 
+0

wsdlファイルがある場合は、XML :: Compileを試してください。これにより、wsdlを使用して正しいメッセージを自動的に生成することができます。しかし、それは時々トリッキーになります。 – simbabque

+0

私の質問をお読みください。私はリクエストの正しいフォーマットを知っていますが、SOAP :: Liteを使って送る方法を理解できません。 – ShinobiDev

+0

私はあなたの質問を読んだので、私は代替案を提案しています。 SOAP :: Liteで遊んでいるのはイライラしています。 https://metacpan.org/pod/distribution/XML-Compile-SOAP/lib/XML/Compile/SOAP.podを試してみると、おそらく名前空間と属性をより良く処理できることがわかります。 – simbabque

答えて

1

これは、SOAP :: Liteの要求を使用して、必要な応答を生成する必要があります。

use strict; 
use warnings; 
use SOAP::Lite +trace=>'all'; 

$on_action = ''; 
$proxy = 'http://serviceURL'; 

$soap = SOAP::Lite->new(proxy => $proxy); 
$soap->on_action(sub {$on_action}); 
$soap->readable(1); 
$soap->autotype(0); 
$soap->serializer->register_ns('http://mycompany.com/InquireEnterpriseOrderDataRequest.xsd' => 'xsi'); 
$soap->serializer->register_ns('http://mycompany.com/InquireEnterpriseOrderDataRequest.xsd' => 'xsi:schemaLocation'); 
$soap->default_ns('http://mycompany.com/InquireEnterpriseOrderDataRequest.xsd'); 
$soap->envprefix('SOAP-ENV'); 

$sheader = SOAP::Header->name(MessageHeader =>\SOAP::Header->value(SOAP::Header->name(TrackingMessageHeader => \SOAP::Header->value(
       SOAP::Header->name(version => 111), 
       SOAP::Header->name(originalVersion => ''), 
       SOAP::Header->name(messageId => ''), 
       SOAP::Header->name(originatorId => 'ABC'), 
       SOAP::Header->name(responseTo => ''), 
       SOAP::Header->name(returnURL => ''), 
       SOAP::Header->name(timetoLive => 360000), 
       SOAP::Header->name(conversationId => '9AF0E9281A524262980F5284F4C57888_CCE423E277C74FA9A84D2155CD612EB3_0'), 
       SOAP::Header->name(routingRegionOverride => ''), 
       SOAP::Header->name(dateTimeStamp => '2017-04-11T18:47:53Z'), 
       SOAP::Header->name(timetoLive => 'mytransid'), 
      ))->prefix('ns2')))->attr({'xmlns:ns2' => 'http://mycompany.com/MessageHeader.xsd',xmlns => 'http://mycompany.com/CingularDataModel.xsd'})->prefix('ns2'); 

push @request,(
     SOAP::Data->name(OrderSearchCriteria => \SOAP::Data->value(
      SOAP::Data->name(OrderDetails => \SOAP::Data->value(
       SOAP::Data->name(SearchByOrderAction => \SOAP::Data->value(
       SOAP::Data->name(orderActionNumber => 12345654), 
       SOAP::Data->name(orderActionVersion => 1), 
))))))); 
$reply = $soap->InquireEnterpriseOrderDataRequest($sheader,@request); 
+0

これは私がやろうとしていたことですが、ヘッダー要素に属性を割り当てる方法を理解できませんでした。 最後に問題になっているのは、ヘッダーブロックを破棄せずに、 "SecurityMessageHeader"セクションと "SequenceMessageHeader"セクションで作業する方法です。これのための任意のアイデア? – ShinobiDev

+0

http://www.wlp-systems.de/soap-lite-and-ws-security.htmlまたはgoogleをご覧ください。私はSOAP :: Liteと一緒に使っていました。 –

関連する問題