我公司使用了很多內部API,它們使用非常特定的頭和格式要求。我是SOAP :: Lite的新手,我試圖讓它在公司的框架內工作。發送非常具體的SOAP :: Lite請求
嘗試#1: 理想情況下,我想能夠只是採取原始的XML模板(見職位的底部),填充一些佔位符變量,並將其發送給使用下面的代碼端點:
my $client = SOAP::Lite->new(proxy => "$serviceURL");
my $reply = $client->InquireEnterpriseOrderDataRequest($rawxml);
然而,這導致我的頭,並要求部分被封閉在自己的「信封」,「身體」和「InquireEnterpriseOrderDataRequest」,這是由服務拒絕。
嘗試#2: 我想接下來的事情是打破我的要求分爲兩個部分:頭和請求,並使用SOAP::Data
和SOAP::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>
如果您有wsdl文件,請嘗試使用XML :: Compile。它允許您使用wsdl自動生成正確的消息。但它有時會變得棘手。 – simbabque
請閱讀我的問題。我知道請求的正確格式,我只是不知道如何使用SOAP :: Lite發送它。 – ShinobiDev
我已閱讀你的問題,這就是爲什麼我建議一個替代方案。玩弄SOAP :: Lite令人沮喪。給https://metacpan.org/pod/distribution/XML-Compile-SOAP/lib/XML/Compile/SOAP.pod試一試,你會發現它可能會更好地處理命名空間和屬性。 – simbabque