可能會提出這個問題,但搜索起來很困難,我找不到任何有關它的信息。再加上它不容易問。Zend SOAP:在WSDL中將缺省數組元素名稱「item」更改爲複雜類型的類名稱
我正在使用Zend SOAP的自動發現重新創建我們的舊SOAP接口(因爲切換到微服務和重新工作的一切)。
到目前爲止,它的工作就像一個魅力。但是在使用列表/數組時,我在重新創建一些服務的SOAP響應時遇到了一個問題。
SOAP請求的舊響應XML看起來像這樣。它包含<SMSEntries>
列表中的兩個<SMSEntry>
。
<SOAP-ENV:Envelope>
<SOAP-ENV:Body>
<ns1:getSMSByTimeSpanResult>
<AmountOfEntries>2</AmountOfEntries>
<SMSEntries>
<SMSEntry></SMSEntry>
<SMSEntry></SMSEntry>
</SMSEntries>
</ns1:getSMSByTimeSpanResult>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
但重新創建的響應看起來像這樣。它包含<SMSentries>
列表中的SMSEntry
類型的兩個<item>
。
<SOAP-ENV:Envelope>
<SOAP-ENV:Body>
<ns1:getSMSByTimeSpanResponse>
<return xsi:type="ns1:getSMSByTimeSpanResponse">
<AmountOfEntries xsi:type="xsd:int">2</AmountOfEntries>
<SMSEntries SOAP-ENC:arrayType="ns1:SMSEntry[2]" xsi:type="ns1:ArrayOfSMSEntry">
<item xsi:type="ns1:SMSEntry"></item>
<item xsi:type="ns1:SMSEntry"></item>
</SMSEntries>
<DataEx xsi:nil="true"/>
</return>
</ns1:getSMSByTimeSpanResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我無法控制客戶。他們可能正在通過比較字符串來檢查SMSEntry
。我想使用類名稱SMSEntry
作爲XML標籤名稱。
二,我想省略其他的東西,包裝一切,<return>
標籤。
我使用這樣的自動發現:
use Zend\Soap\AutoDiscover;
use Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeComplex;
$autoDiscover = new AutoDiscover(new ArrayOfTypeComplex());
$autoDiscover->setClass(new Standard($sm));
的getSMSByTimeSpanResponse的定義是這樣的:
Standard.php
/**
* Class getSMSByTimeSpanResponse
*
* @package LgxServiceManager\Service
*/
class getSMSByTimeSpanResponse
{
/**
* @var int
*/
public $AmountOfEntries;
/**
* @var \LgxServiceManager\Service\SMSEntry[]
*/
public $SMSEntries;
}
/**
* Class SMSEntry
*
* @package LgxServiceManager\Service
*/
class SMSEntry
{
}
有誰知道如何任何想法這個?
我發現一些代碼在library\Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeSequence.php:122
凡_addSequenceType()
一種方法是設置硬編碼的屬性:
$element->setAttribute('name', 'item');
但這式「序列」不輸入「情結」就像我使用...
謝謝你在前進, 菲利普
\ ED IT
天哪......我只是發現了另一種結構,我不知道如何與Zend的SOAP的自動發現創建...
<mainMember1>SERIALNUMBER</mainMember1>
<mainMember2>NAMEOFPRODUCT</mainMember2>
<mainMember3>000000-000-0</mainMember3>
<Rules>
<RuleEntry>
<singleValue>allow</singleValue>
<ResourceList>
<Name>generic</Name>
<ResourceEntry>[...]</ResourceEntry>
<ResourceEntry>[...]</ResourceEntry>
<ResourceEntry>[...]</ResourceEntry>
</ResourceList>
<ResourceList>
<Name>default</Name>
<ResourceEntry>[...]</ResourceEntry>
<ResourceEntry>[...]</ResourceEntry>
<ResourceEntry>[...]</ResourceEntry>
</ResourceList>
</RuleEntry>
</Rules>
正如你可以看到,裏面有一個在<singleValue>
<RuleEntry>
但是多個<ResourceList>
s。資源列表中使用相同的結構:一個<Name>
和多個<ResourceEntry>
...
這甚至可以用自動發現來處理嗎?
這也許給你一些提示:http://stackoverflow.com/questions/17307571/zend-framework-2-soap-autodiscover-and-complex-types –
謝謝。我自己想出了這個問題,並且已經按照我的問題代碼中所描述的那樣使用它。我的WSDL看起來非常好。但是,XML的響應要比那些「item」元素... –
無論答案如何,我都感到你的痛苦。任何時候任何人都應該暗示使用SOAP,你必須非常快速地喊「使用REST!」在他們身上。 – icc97