2017-02-03 73 views
1

我正在使用SOAP :: Lite連接到外部服務。經過與其他公司的多次反覆試驗和溝通,我發現了這個問題。使用SOAP :: Lite在「method」元素中定義名稱空間

我的代碼如下所示:

$soap = new SOAP::Lite 
    ->service($wsdl_link) 
    ->uri($url_link) 
    ->proxy($proxy_link) 
    ->on_action(sub { sprintf '"%s%s"', shift, shift }); 
my $resp = $soap->call('CreateAssignment',SOAP::Data->type('xml'=>$xml), 
           SOAP::Header->type('xml'=>$headXML)); 

這將產生以下XML:

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" > 
<soap:Header> 
... 
</soap:Header> 
<soap:Body> 
<CreateAssignment xmlns="url_link"> 
... 
</CreateAssignment></soap:Body></soap:Envelope> 

(其中url_link是有效的URL)

我需要定義額外的命名空間。我通過在我的代碼中添加了->ns(namespace, prefix)來完成此操作。但是,這會將附加名稱空間添加到「envelope」標記中。我被公司告知,名稱空間需要位於「CreateAssignment」標籤上。事實上,當我做出適當的改變並使用SOAP UI運行它時,它的運行非常好。

我曾嘗試在我的xml中添加「CreateAssignment」標記,並且在沒有方法的情況下運行call()函數。 SOAP :: Lite將xml封裝在通用標記中。

我已經閱讀了SOAP :: Lite文檔,我詢問了搜索引擎,我問過同事,沒有人有答案。

有沒有辦法強制SOAP :: Lite把命名空間聲明放在我需要它們的地方?

如果不是,什麼是更好的模塊使用?

+0

Re「*我被公司告知,名稱空間需要位於」CreateAssignment「標籤上。*」,您正在將名稱空間分配給前綴,對嗎? (這是沒有任何意義的。)如果是這樣,公司是錯誤的。 – ikegami

回答

0

我最終坐下來和另一位同事坐在一起,閱讀SOAP :: Lite的源代碼 - 我們發現方法標籤是在sub envelope中構建的。有一個if語句,由此模塊將使用整個對象如果不是一個字符串對象一個SOAP ::數據對象被傳遞在作爲該方法:

$soap = new SOAP::Lite 
->service($wsdl_link) 
->uri($url_link) 
->proxy($proxy_link) 
->on_action(sub { sprintf '"%s%s"', shift, shift }); 
my $resp = $soap->call('CreateAssignment',SOAP::Data->type('xml'=>$xml), 
           SOAP::Header->type('xml'=>$headXML)); 

elsif (UNIVERSAL::isa($method => 'SOAP::Data')) { 
      $body = $method; 
     } 

我從這個變

要這樣:

$method = SOAP::Data->new(name=>'ns4:CreateAssignment'); 
$method->attr({'xmlns'=> $namespaceOne, 
      'xmlns:ns2'=> $namespaceTwo, 
      'xmlns:ns3'=> $namespaceThree, 
      'xmlns:ns4'=> $namespaceFour, 
      'xmlns:ns5'=> $namespaceFive}); 

$soap = new SOAP::Lite 
     ->service($wsdl_link) 
     ->uri($url_link) 
     ->proxy($proxy_link) 
     ->on_action(sub { sprintf '"%s%s"', shift, shift }); 

my $resp = $soap->call($method,SOAP::Data->type('xml'=>$xml), 
           SOAP::Header->type('xml'=>$headXML)); 

這造成我的方法標籤完全按照要求公司:

<ns4:CreateAssignment xmlns="namespaceOne" xmlns:ns2="namespaceTwo" xmlns:ns3="namespaceThree" xmlns:ns4="namespaceFour" xmlns:ns5="namespaceFive"> 
... 
</ns4:CreateAssignment>