我正在使用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把命名空間聲明放在我需要它們的地方?
如果不是,什麼是更好的模塊使用?
Re「*我被公司告知,名稱空間需要位於」CreateAssignment「標籤上。*」,您正在將名稱空間分配給前綴,對嗎? (這是沒有任何意義的。)如果是這樣,公司是錯誤的。 – ikegami