2017-05-12 52 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 ::精簡版的請求所需的響應。

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或谷歌它。我用它與SOAP :: Lite。 –